通过所有对象包含的String值对Set内的对象进行排序

时间:2010-11-09 09:55:25

标签: java sorting object set

好的,这是一个棘手的问题。我有一个集合列表。我想按顺序对集合中的对象进行排序。

想象一下,每一套都是在学校里代表一个班级。每组包含人物对象。 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个以上的孩子可能拥有相同的名字,但请忽略此

7 个答案:

答案 0 :(得分:13)

Set没有排序的概念,因为它是一个集合。

您可以使用SortedSet类实现的TreeSet接口。只需向构造函数提供适当的Comparator,或让Person类实现Comparable

答案 1 :(得分:7)

您必须为可排序对象(Person等)实施Comparable

然后:

  1. 将设置转换为列表(部分信息here),因为您无法对Set
  2. 进行排序
  3. 使用Collections.sort
    1. 转换为SortedSet(如TreeSet
    2. 使用Comparator进行自定义排序
    3. 示例:

      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的名称。