使用 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() 方法,否则您有 referenceEntry 对象。所以根据我的猜测,你需要这样做:

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"的位置添加了新的EntryEntry 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);