根据比较字段和字符串列表对对象列表进行排序

时间:2019-03-28 09:09:11

标签: java list sorting comparator

我有学生对象列表

Student对象具有

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

我需要基于list1对列表进行排序。

我的输出应该是

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

3 个答案:

答案 0 :(得分:1)

如何像这样使用Java 8:

list.sort(Comparator.comparing(Student::getName,
                               Comparator.comparing(list1::indexOf)));

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以创建自己的自定义比较器。

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