【问题标题】:How to sort an attribute of an object using Collections如何使用集合对对象的属性进行排序
【发布时间】:2011-05-09 05:02:40
【问题描述】:

美好的一天!

我有一个具有以下属性的对象学生:

class Student
    String name
    Date birthday

我使用 arrayList 来存储学生对象 我的问题是,如何使用 collecitons 排序按生日对 StudentList 进行排序?

List <Student> studentList = new ArrayList<Student>();

如何编码?

Collections.sort(????);

谢谢

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以将Comparator 传递给Collections.sort() 来处理生日排序:

    Collections.sort(studentList, new Comparator<Student>() {
        public int compare(Student s1, Student s2) {
            return s1.getBirthday().compareTo(s2.getBirthday());
        }
    });
    

    如果您还没有 getBirthday() 类,则需要将其添加到您的 Student 类中。

    【讨论】:

    • 谢谢@WhiteFang34!这正是我想要的!我浪费了很多时间尝试在设置对象之前对属性进行排序。我不知道如何处理按属性排序
    【解决方案2】:

    在 Java 8 中,您可以使用 Lambda expressions 和 Comparator.comparing 对列表进行单行排序:

    Collections.sort(studentList, Comparator.comparing(s -> s.getBirthday()));
    

    您也可以使用方法参考:

    Collections.sort(studentList, Comparator.comparing(Student::getBirthday));
    

    【讨论】:

    • 生日不应为空
    【解决方案3】:

    您好,这是一个可以帮助您理解的示例

    package de.vogella.algorithms.sort.standardjava;
    
    import java.util.Comparator;
    
    public class MyIntComparable implements Comparator<Integer>{
    
        @Override
        public int compare(Integer o1, Integer o2) {
            return (o1>o2 ? -1 : (o1==o2 ? 0 : 1));
        }
    }
    
    
    package de.vogella.algorithms.sort.standardjava;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Simple2 {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            list.add(5);
            list.add(4);
            list.add(3);
            list.add(7);
            list.add(2);
            list.add(1);
            Collections.sort(list, new MyIntComparable());
            for (Integer integer : list) {
                System.out.println(integer);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      您需要编写一个自定义比较器。

      类似:

      Collections.sort(studentList, new Comparator<Student>() {
      
          public int compare(Strudent a, Strudent b) {
              return a.birthday.compareTo(b.birthday);
          }
      
      });
      

      【讨论】:

        【解决方案5】:

        这是来自 java 的教程,以了解更多信息。 http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

        【讨论】:

          【解决方案6】:

          这可能是一个棘手的面试问题:)

          我发现解决类似问题的最佳和可重用方法是实现接口 Comparator 并根据我的需要创建自定义 Comparator ,可以重用。

          我在这里留下一个示例,如何根据姓名属性和性别属性(没有任何词典自然顺序)对 Person 的 ArrayList 进行排序。

          诀窍是使用我想要排序的自定义属性定义一个枚举类。将自定义比较器应用于该枚举属性, compareTo() 方法根据声明值的自然顺序应用顺序(在此示例中为男性、女性、其他)。

          import java.util.*;
          
          public class Person {
          
          public enum Gender {
              male,female, others
          }
          
          String name;
          int age;
          Gender gender;
          
          public Person(String name, int age, Gender gender) {
              this.name = name;
              this.age = age;
              this.gender = gender;
          }
          
          public String getName() {
              return name;
          }
          
          public Gender getGender() {
              return gender;
          }
          
          @Override
          public String toString() {
              return "Person{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      ", gender='" + gender + '\'' +
                      '}';
          }
          
          public static void printPersons(List<Person> personList) {
          
              for (int i = 0; i < personList.size(); i++) {
                  System.out.println(personList.get(i).toString());
              }
          }
          
          public static void printSortedByAgePersons(List<Person> personList) {
              Collections.sort(personList, Person.COMPARE_BY_NAME);
              for (int i = 0; i < personList.size(); i++) {
                  System.out.println(personList.get(i).toString());
              }
          }
          
          public static void printSortedByGender(List<Person> personList) {
              Collections.sort(personList, Person.COMPARE_BY_GENDER);
              printPersons(personList);
          }
          
          public static Comparator<Person> COMPARE_BY_NAME = new Comparator<Person>() {
              @Override
              public int compare(Person o1, Person o2) {
                  return o1.getName().compareTo(o2.getName());
              }
          };
          
          public static Comparator<Person> COMPARE_BY_GENDER = new Comparator<Person>() {
              @Override
              public int compare(Person o1, Person o2) {
                  return o1.getGender().compareTo(o2.getGender());
              }
          };
          
          
          // lets test this :
          public static void main(String args[]) {
          
              Person p1 = new Person("André", 22, Gender.male);
              Person p2 = new Person("Minder", 19, Gender.others);
              Person p4 = new Person("Maria", 19, Gender.female);
              Person p3 = new Person("Pedro", 25, Gender.male);
          
              List<Person> personList = new ArrayList<Person>();
              personList.add(p1);
              personList.add(p2);
              personList.add(p3);
              personList.add(p4);
          
              System.out.println("original list:");
              printPersons(personList);
          
              System.out.println("------------------------------------------");
              System.out.println("sorted list by name in alphabetical order");
              printSortedByAgePersons(personList);
          
              System.out.println("------------------------------------------");
              System.out.println("sorted list by custom order(gender)");
              printSortedByGender(personList);
          
          }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-13
            • 2011-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-26
            相关资源
            最近更新 更多