Сортировка списка объектов на основе сравнения поля со списком строк - PullRequest
2 голосов
/ 28 марта 2019

У меня есть объект списка учеников

И у объекта ученика есть

public class Student{

    private String name;
    private String town;

    // getters,setters and toString method

}

И мой List<Student> выглядит так:

List<Student> list = new ArrayList<Student>();
list.add(new Student("abc","xtown"));
list.add(new Student("bcd","ytown"));
list.add(new Student("cdf","xtown"));
list.add(new Student("fgh","Atown"));

И еще один список

List<String> list1 = new ArrayList<>();
list1.add("bcd");
list1.add("cdf");
list1.add("fgh");
list1.add("abc"); 

Мне нужно отсортировать список на основе списка 1.

Мой вывод будет

[Student [name=bcd,town=ytown], 
 Student [name=cdf,town=xtown], 
 Student [name=fgh,town=Atown], 
 Student [name=abc,town=xtown]]

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Хотя ответ YCF_L, пожалуй, самый элегантный, я чувствую, что для оригинального плаката может пригодиться более простое для понимания решение, вот один из них

Сначала создайте список того же размера, что и список, который выхотите отсортировать и инициализировать все элементы в null:

List<Student> sortedList = new ArrayList<>(Collections.nCopies(list.size(), null));

Затем просмотрите список студентов и добавьте их с правильным индексом

С помощью простого цикла for:

int index;
for(Student student : list) {
    index = list1.indexOf(student.getName());
    sortedList.set(index, student);
}

Или используя forEach:

list.forEach(student -> {
    int index = list1.indexOf(student.getName());
    sortedList.set(index, student);
});

Соответствующий однострочный:

list.forEach(s -> sortedList.set(list1.indexOf(s.getName()), s));
1 голос
/ 28 марта 2019

А как насчет использования Java 8 так:

list.sort(Comparator.comparing(Student::getName,
                               Comparator.comparing(list1::indexOf)));
0 голосов
/ 28 марта 2019

Вы можете создать свой собственный компаратор.

Comparator<Student> comparator = new Comparator<Student>()
{
    @Override
    public int compare(Student o1, Student o2)
    {
        int index1 = list1.indexOf(o1.getName());
        int index2 = list1.indexOf(o2.getName());

        return Integer.compare(index1 , index2 );
    }
};

и чем сортировать:)

java.util.Collections.sort(yourList, comparator);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...