【问题标题】:sorting a List<List<Integer>> using java Collections.sort()使用 java Collections.sort() 对 List<List<Integer>> 进行排序
【发布时间】:2014-05-12 12:23:40
【问题描述】:

我有一个列表如下:

List<List<Integer>> matchedPostions = findTerms(originalEntPos, singularEntPos, singText);

考虑这个例子

[ID,StartPostion,EndPostion]
      ^^^
[1,198,200]
[2,50,61]

我正在尝试使用Collections.sort() 对列表进行排序。如何根据StartPostion 值对matchedPostions 中的值从低到高进行排序?

【问题讨论】:

  • 您正在尝试对用户定义的对象进行排序。您将不得不使用 Comparator 或可比较的接口。这些链接将对您有所帮助。thejavageek.com/2013/06/17/sorting-user-defined-objects-part-1
  • 这看起来不像整数列表。这将是一个列表列表:[1,198,200], [2,50,61]
  • 内部列表看起来像一个坐标值,为什么不给它定义一个Class呢。

标签: java sorting collections


【解决方案1】:

您需要实现Comparator 来对您提供的自定义数据结构进行排序。

import static java.util.Arrays.asList;

List<List<Integer>> matchedPostions = asList(asList(1, 198, 200), asList(2, 50, 61));
Collections.sort(matchedPostions, new Comparator<List<Integer>>() {
    @Override
    public int compare(List<Integer> o1, List<Integer> o2) {
        // Sort the lists using the starting position (second element in the list)
        return o1.get(1).compareTo(o2.get(1));
    }
});

System.out.println(matchedPostions);
// [[2, 50, 61], [1, 198, 200]]

这是“肮脏”的方式。 Duncan 描述了更惯用的方法,您在其中实现了一个正确封装数据的Range 类。

【讨论】:

    【解决方案2】:

    我强烈建议您创建一个类来保存您的列表值。这使您可以享受类型安全的好处,包括确保您始终有两个整数值(而不是列表中未知数量的项目)。例如:

    public class Range implements Comparable<Range> {
        private final int startPosition;
        private final int endPosition;
    
        public Range(int startPosition, int endPosition) {
            this.startPosition = startPosition;
            this.endPosition = endPosition;
        }
    
        @Override
        public int compareTo(Range o) {
            return startPosition - o.startPosition;
        }
    
        @Override
        public String toString() {
            return String.format("[%d,%d]", startPosition, endPosition);
        }
    }
    

    因为这个类实现了Comparable,所以可以用普通的Collections.sort method排序:

    public static void main(String[] args) throws Exception {
        List<Range> ranges = Arrays.asList(new Range(198, 200), new Range(50,
                61));
    
        System.out.println("Unsorted");
        for (Range range : ranges) {
            System.out.println(range);
        }
    
        Collections.sort(ranges);
    
        System.out.println("Sorted");
        for (Range range : ranges) {
            System.out.println(range);
        }
    }
    

    输出:

    Unsorted
    [198,200]
    [50,61]
    Sorted
    [50,61]
    [198,200]
    

    【讨论】:

      【解决方案3】:

      对于内部列表,您可以循环遍历它们:

      for(List<Integer> inner : outer){
          Collections.sort(inner);
      }
      

      对于外部列表,您需要一个自定义比较器。

      【讨论】:

        【解决方案4】:

        如果您无法为范围定义自己的专用类,您可以使用自己的Comparator 调用Collections.sort。示例如下:

        Collections.sort(list, new Comparator<List<Integer>>() {
                        @Override
                        public int compare(List<Integer> l1, List<Integer> l2) {
                            return l1.get(0).compareTo(l2.get(0));
                        }
                    });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-29
          • 1970-01-01
          • 1970-01-01
          • 2017-11-02
          • 2012-07-15
          • 2014-02-05
          相关资源
          最近更新 更多