好的,这是一个棘手的问题。我有一个集合列表。我想按顺序对集合中的对象进行排序。
想象一下,每一套都是在学校里代表一个班级。每组包含人物对象。 person对象包含name的String值。在我循环并写出来之前,我想按照名字安排人员。
是否有任何人使用Collections.sort();
或类似的东西来实现这一目标?
for (Set<Person> s : listOfAllChildren) {
for (Person p : s) {
if(p.getClass().equalsIgnoreCase("Jones")){
System.out.println(p.getName());
}
else if...//carry on through other classes
}
}
我知道一个班级中有2个以上的孩子可能拥有相同的名字,但请忽略此
答案 0 :(得分:13)
Set
没有排序的概念,因为它是一个集合。
您可以使用SortedSet
类实现的TreeSet
接口。只需向构造函数提供适当的Comparator
,或让Person
类实现Comparable
。
答案 1 :(得分:7)
您必须为可排序对象(Person
等)实施Comparable
。
然后:
Set
Collections.sort
或
示例:
import java.util.*;
class Person implements Comparable<Person> {
private String firstName, lastName;
public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName;}
public String getFirstName() {return firstName;}
public String getLastName() {return lastName;}
public String getName() {return firstName + " " + lastName;}
public int compareTo(Person p) {
return lastName.compareTo(p.lastName);
}
}
class FirstNameComparator implements Comparator<Person> {
public int compare(Person p1, Person p2){
return p1.getFirstName().compareTo(p2.getFirstName());
}
}
class Test {
public static void log(String s) {
System.out.println(s);
}
public static void main(String[] args) {
Set<Person> people = new HashSet<Person>();
people.add(new Person("Bob", "Jones"));
people.add(new Person("Alice", "Yetti"));
log("Sorted list:");
List<Person> peopleList = new LinkedList<Person>();
peopleList.addAll(people);
Collections.<Person>sort(peopleList);
for (Person p : peopleList) {
log(p.getName());
}
log("TreeSet:");
TreeSet<Person> treeSet = new TreeSet<Person>();
treeSet.addAll(people);
for (Person p : treeSet) {
log(p.getName());
}
log("TreeSet (custom sort):");
TreeSet<Person> treeSet2 = new TreeSet<Person>(new FirstNameComparator());
treeSet2.addAll(people);
for (Person p : treeSet2) {
log(p.getName());
}
}
};
答案 2 :(得分:6)
使用Java 8,您可以对Set
个人进行排序,并生成List
个按以下方式排序的人员。
List<Person> personList = personSet.stream().sorted((e1, e2) ->
e1.getName().compareTo(e2.getName())).collect(Collectors.toList());
答案 3 :(得分:1)
您可以考虑使用TreeSet来存储对象。当排序使用Person对象的自定义比较器创建新的TreeSet时。我建议不要使用Collection.sort,因为AFAIR只能对列表进行排序。
答案 4 :(得分:0)
您可以让Person类实现Comparable所示的here界面,然后对其进行相应的排序。
答案 5 :(得分:0)
是的!这绝对可以使用Collection.sort()。但是您需要使用有序集(如TreeSet)。或者,您也可以先将Set中的所有元素插入List。
然后,您的Person类需要实现Comparable,因为当它试图决定放置它们的顺序时,Collections.sort()将调用此接口。所以它可以是简单的东西:
public class Person implements Comparable<Person> {
...
@Override
public int compareTo(Person p) {
return this.name.compareTo(p.name);
}
}
如果使用TreeSet,则应对其进行排序。否则,如果使用List,只需在每个列表上调用Collections.sort(List l)。
答案 6 :(得分:0)
您可能希望使用SortedSet
例如TreeSet
。这样您就可以提供Comparator
,在您的情况下可以比较Person
的名称。