В алфавитном порядке новые записи в ArrayList, используя метод CompareTo - PullRequest
0 голосов
/ 16 марта 2019

Я хочу упорядочить записи в алфавитном порядке в каталоге ArrayList, который называется records. Я хочу, чтобы новая запись добавлялась в каталог для размещения в соответствующей позиции в ArrayList.

Например, если в каталоге уже есть две записи с фамилиями: «Beta» и «Cee», и мы хотим добавить новую запись с фамилией: «Alpha», «Альфа» должна быть помещена первой.

У меня вопрос: как я могу перезаписать метод compareTo для сравнения двух строк (строка «одна» и другая строка, передаваемая в метод «фамилия») в алфавитном порядке?

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

Ответы [ 3 ]

2 голосов
/ 16 марта 2019

По моему мнению, 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 голос
/ 16 марта 2019
String one= entries.get(x).toString();

в этой строке кода у вас есть reference из Entry объекта, если у вас нет overridden toString() метода.Итак, исходя из моего предположения, вам нужно сделать следующее:

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

Поскольку вам нужно сравнить фамилии, получите фамилию этой сущности, а затем сравните ее с фамилией новой сущности.Это сделает свое дело!

0 голосов
/ 16 марта 2019

Вы можете добавить свою запись в любой индекс в вашем 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());
}
...