使用 compareTo 方法按字母顺序排列 ArrayList 中的新条目
Alphabetically order new entries in an ArrayList using the compareTo method
我想按字母顺序将条目排序到名为条目的 ArrayList 目录中。我想作为一个新条目添加到目录中以放置到 ArrayList 中的适当位置。
例如,如果目录中已有两个姓氏的条目:"Beta" 和 "Cee",我们想添加一个姓氏为 "Alpha" 的新条目,
"Alpha"应该放在第一位。
我的问题是,如何覆盖 compareTo 方法以按字母顺序比较两个字符串(字符串 "one" 和传入方法的另一个字符串 -"surname")?
private ArrayList<Entry> entries=new ArrayList<>();
public void addEntry(String surname, String initial, String number) {
Entry entry=new Entry(surname,initial,number);
if (surname == null || initial == null || number == null)
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
else {
boolean flag = false;
for (int x = 0; x < entries.size(); x++) {
String one= entries.get(x).getSurname();
if (one.compareTo(surname)>0) {
entries.add(x,entry);
flag = true;
break;
}
}
if (!flag) {
entries.add(entry);
}
}
}
String one= entries.get(x).toString();
在这行代码中,除非您有 overridden
toString()
方法,否则您有 reference
个 Entry
对象。所以根据我的猜测,你需要这样做:
String one = entries.get(x).getSurname();
因为您需要比较姓氏,请获取该实体的姓氏,然后将其与新实体的姓氏进行比较。这样就可以了!
您可以将条目添加到 ArrayList
中的任何索引,然后使用流
对列表进行排序
public void addEntry(String surname, String initial, String number) {
if (surname == null || initial == null || number == null)
throw new IllegalArgumentException(
"Please fill all the required fields, [surname,initials,number]");
}
Entry entry=new Entry(surname,initial,number);
entries.add(entry);
entries = entries.stream()
.map(eachEntry -> eachEntry.getSurname())
.sorted((a, b) -> a.compareTo(b))
.collect(Collectors.toList());
}
在我看来ArrayList
对于这种情况不是一个正确的选择,你似乎按照compareTo
的方法在"correct"的位置添加了新的Entry
在 Entry
class.
中定义
因此,理想情况下,应该使用 TreeSet
,它基本上保持基于 Entry
class 中定义的 compareTo
的元素顺序,即 "default ordering".
class Entry implements Comparable<Entry>{
private String surname;
private String initial;
private String number;
Entry(String surname, String initial, String number){
this.surname = surname;
this.number =number;
this.initial = initial;
}
@Override
public int compareTo(Entry entry){
return this.surname.compareTo(entry.surname);
}
}
而 addEntry
方法应该很简单:
private Set<Entry> entries = new TreeSet<>();
public void addEntry(String surname, String initial, String number) {
if (surname == null || initial == null || number == null)
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
else {
Entry entry=new Entry(surname,initial,number);
entries.add(entry);
}
}
如果你真的需要一个 List
,你可以简单地将 TreeSet
实例包装在 ArrayList
构造函数中:
List<Entry> list = new ArrayList(entries);
我想按字母顺序将条目排序到名为条目的 ArrayList 目录中。我想作为一个新条目添加到目录中以放置到 ArrayList 中的适当位置。
例如,如果目录中已有两个姓氏的条目:"Beta" 和 "Cee",我们想添加一个姓氏为 "Alpha" 的新条目, "Alpha"应该放在第一位。
我的问题是,如何覆盖 compareTo 方法以按字母顺序比较两个字符串(字符串 "one" 和传入方法的另一个字符串 -"surname")?
private ArrayList<Entry> entries=new ArrayList<>();
public void addEntry(String surname, String initial, String number) {
Entry entry=new Entry(surname,initial,number);
if (surname == null || initial == null || number == null)
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
else {
boolean flag = false;
for (int x = 0; x < entries.size(); x++) {
String one= entries.get(x).getSurname();
if (one.compareTo(surname)>0) {
entries.add(x,entry);
flag = true;
break;
}
}
if (!flag) {
entries.add(entry);
}
}
}
String one= entries.get(x).toString();
在这行代码中,除非您有 overridden
toString()
方法,否则您有 reference
个 Entry
对象。所以根据我的猜测,你需要这样做:
String one = entries.get(x).getSurname();
因为您需要比较姓氏,请获取该实体的姓氏,然后将其与新实体的姓氏进行比较。这样就可以了!
您可以将条目添加到 ArrayList
中的任何索引,然后使用流
public void addEntry(String surname, String initial, String number) {
if (surname == null || initial == null || number == null)
throw new IllegalArgumentException(
"Please fill all the required fields, [surname,initials,number]");
}
Entry entry=new Entry(surname,initial,number);
entries.add(entry);
entries = entries.stream()
.map(eachEntry -> eachEntry.getSurname())
.sorted((a, b) -> a.compareTo(b))
.collect(Collectors.toList());
}
在我看来ArrayList
对于这种情况不是一个正确的选择,你似乎按照compareTo
的方法在"correct"的位置添加了新的Entry
在 Entry
class.
因此,理想情况下,应该使用 TreeSet
,它基本上保持基于 Entry
class 中定义的 compareTo
的元素顺序,即 "default ordering".
class Entry implements Comparable<Entry>{
private String surname;
private String initial;
private String number;
Entry(String surname, String initial, String number){
this.surname = surname;
this.number =number;
this.initial = initial;
}
@Override
public int compareTo(Entry entry){
return this.surname.compareTo(entry.surname);
}
}
而 addEntry
方法应该很简单:
private Set<Entry> entries = new TreeSet<>();
public void addEntry(String surname, String initial, String number) {
if (surname == null || initial == null || number == null)
throw new IllegalArgumentException("Please fill all the required fields, [surname,initials,number]");
else {
Entry entry=new Entry(surname,initial,number);
entries.add(entry);
}
}
如果你真的需要一个 List
,你可以简单地将 TreeSet
实例包装在 ArrayList
构造函数中:
List<Entry> list = new ArrayList(entries);