使用compareTo方法按字母顺序在ArrayList中排序新条目

问题描述 投票:0回答:3

我想按字母顺序将条目排序到名为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);
        }
    }
}
java string-comparison compareto
3个回答
2
投票

在我看来ArrayList不是这种情况的正确选择,你似乎根据Entry类中定义的compareTo方法将新的Entry添加到“正确”位置。

所以理想情况下应该使用TreeSet,它基本上维持元素的排序基于compareTo类中定义的Entry,这是“默认排序”。

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); 

1
投票
String one= entries.get(x).toString();

在这行代码中你有referenceEntry对象,除非你有overridden toString()方法。所以从我的猜测你需要这样做:

String one = entries.get(x).getSurname();

当您需要比较姓氏时,请获取该实体的姓氏,然后将其与新实体的姓氏进行比较。那就行了!


0
投票

您可以将条目添加到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());
}
© www.soinside.com 2019 - 2024. All rights reserved.