【问题标题】:Sorting an array of objects by more than one field按多个字段对对象数组进行排序
【发布时间】:2013-05-03 07:22:43
【问题描述】:

假设我有一个数组,其中包含 10 个对象,每个对象有 3 个值应该代表一个排名表

Team1 20 5
Team2 21 6
Team3 21 8
Team4 23 8

我想按第一个值(点数)排序,然后按第二个值(目标差)。

如果我覆盖compareto() 并编写一段自定义代码,Arrays.sort() 将起作用。

有没有更简单的方法?通过转换为列表等?

【问题讨论】:

    标签: java sorting


    【解决方案1】:

    创建Comparator 是解决此问题的正确方法。然后是使用Arrays.sort() 还是Collections.sort() 取决于您。

    我建议前者避免转换为列表,因此更可取。

    我建议您不要通过在对象中实现 Comparable 来解决此问题,因为这听起来像是一个显示问题,并且在对象本身中嵌入排序顺序可能并不明智。


    一个示例(未经测试的)实现可能是:

    public class ExampleComparator implements Comparator<YourObject> {
    
      public int compare(YourObject o1, YourObject o2) {
        if (o1 == null || o2 == null) {
          throw new NullPointerException();
        }
    
        if (o1.getValue1() != o2.getValue1()) {
          return Integer.compare(o1.getValue1(), o2.getValue1());
        }
    
        return Integer.compare(o1.getValue2(), o2.getValue2());
      }
    }
    

    【讨论】:

    • 我尝试在我的比较中编写自定义代码(这似乎有效)我很想使用比较器。有什么基本的例子吗?
    • @DavidA 查看编辑以获取示例实现。有关各种真实示例,请访问 Google。
    【解决方案2】:

    java 中没有任何generic,它允许您使用多个参数执行排序。您必须实现自己的排序算法或创建自己的Comparator。更多详情,您应该有一个look at this post.

    【讨论】:

      【解决方案3】:

      没有捷径可走;将您的数据转换为一个类并覆盖 compareTo 方法。

      Class Bean implements Comparable<Bean>{
        //attributes
        @Override
        public int compareTo(Object o) {
          // TODO Auto-generated method stub
          return 0;
       }
      } 
      

      然后你可以把你的bean对象放在列表中并进行排序..

      List<Bean> list = new ArrayList<Bean>();
      

      【讨论】:

        猜你喜欢
        • 2011-10-18
        • 2011-05-16
        • 2015-03-11
        相关资源
        最近更新 更多