【问题标题】:Need to do sorting of ArrayList<Object> for a particular field?需要对特定字段的 ArrayList<Object> 进行排序吗?
【发布时间】:2011-12-23 19:44:19
【问题描述】:

我需要根据学生对象中的日期对我的 ArrayList 进行排序...如果日期(加入日期)相同,那么我需要根据 ID 对其进行排序...怎么做?

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    这可以通过两种常见的方式完成。

    简单的方法

    1) 让学生提供 Comparable 的实现,最终将推迟到日期。这是一个非常简单的操作,但有点 hack。

    可维护的方式

    2) 或者,Collections.sort 方法将 Comparator 作为输入 - 您可以轻松编写自定义比较器,通过将输入转换为 Student 类并直接返回数据比较来实现排序所需的比较。

    第二种解决方案更加模块化和可维护,除非按日期比较是应用程序的基本、核心方面。

    【讨论】:

    • 从 Java 5 开始,在 Comparator 中大多数时候不再需要强制转换。 ;)
    【解决方案2】:

    在 Student 类中实现 Comparable 接口。然后使用 Collections.sort(list);

    【讨论】:

      【解决方案3】:

      Collections 类有一个将Comparator 作为参数的排序方法:

      List<Student> students;
      
      /* ...students list instantiated and populated somewhere along here... */
      
      Collections.sort(students, new Comparator<Student>() {
      
          @Override
          public int compare(Student student1, Student student2) {
              return student1.joinDate().compareTo(student2.joinDate());
          }
      });
      

      我应该补充一点,如果您的列表确实被声明为Object generic,那么您将不得不进行大量转换。该列表应声明为对Student 的通用列表,并且您应该有其他非学生对象列表。

      【讨论】:

        【解决方案4】:

        您可以通过以下两种方式之一:

        1) 在您的对象上实现Comparable 接口并调用“Collections.sort(yourList);”。

        或者

        2) 为Comparator 接口实现一个新类(假设您将该类称为StudentDateComparator。然后您可以调用Collections.sort(yourList, new StudentDateComparator());`。

        我通常更喜欢后者,因为它可以让我将排序代码与其排序的数据对象分开。

        【讨论】:

          【解决方案5】:
          1. 如果 Student 类基于 ID 字段实现 Comparable,则使用 Collections.sort() 并将列表作为单个参数。

          2. 否则,实现一个使用对象 ID 比较对象的 Comparator,并将其用作 Collections.sort() 的第二个参数。

          【讨论】:

            【解决方案6】:

            你可以这样做:

            要么让类实现Comparable

            public class Student implements Comparable<Student> {
                private Date joinDate;
                private String id;
            
                //...
            
                @Override
                public int compareTo(Student o) {
                    int result = joinDate.compareTo(o.joinDate);
                    if(result != 0) {
                        return result;
                    }
                    return id.compareTo(o.id);
                }    
            }
            

            或者使用Comparator:

            Comparator<Student> comparator = new Comparator<Student>() {
            
                @Override
                public int compare(Student o1, Student o2) {
                    int result = o1.getJoinDate().compareTo(o2.getJoinDate());
                    if (result != 0) {
                        return result;
                    }
                    return o1.getId().compareTo(o1.getId());
                }
            };
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-08-12
              • 2014-06-29
              • 1970-01-01
              • 2013-04-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多