首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java排序列表列表

问Java排序列表列表
EN

Stack Overflow用户
提问于 2016-03-03 10:09:26
回答 3查看 25.1K关注 0票数 20

如何使用Collections.sort()或其他排序方法按字典序对Java语言中的列表列表进行排序?

代码语言:javascript
复制
private List<List<Integer>> possiblePoles = setPoles();    
System.out.println(possiblePoles)
[[1, 3, 5], [1, 2, 3]]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-03 10:17:47

您必须实现自己的Comparator类并将一个实例传递给Collections.sort()

代码语言:javascript
复制
class ListComparator<T extends Comparable<T>> implements Comparator<List<T>> {

  @Override
  public int compare(List<T> o1, List<T> o2) {
    for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) {
      int c = o1.get(i).compareTo(o2.get(i));
      if (c != 0) {
        return c;
      }
    }
    return Integer.compare(o1.size(), o2.size());
  }

}

那么排序就很容易了

代码语言:javascript
复制
List<List<Integer>> listOfLists = ...;

Collections.sort(listOfLists, new ListComparator<>());
票数 30
EN

Stack Overflow用户

发布于 2018-09-28 14:02:20

使用Java8 stream API改进了MartinS回答

代码语言:javascript
复制
possiblePoles = possiblePoles.stream().sorted((o1,o2) -> {
             for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) {
                  int c = o1.get(i).compareTo(o2.get(i));
                  if (c != 0) {
                    return c;
                  }
                }
                return Integer.compare(o1.size(), o2.size());
         }).collect(Collectors.toList());
票数 5
EN

Stack Overflow用户

发布于 2021-04-28 09:39:29

对于这个示例[1,3,1,2],如果您想要按这两个元素对列表进行排序,您可以使用从Java 8手动实现的排序的比较方法,验证所有情况,如以下示例所示:

代码语言:javascript
复制
List<List<Integer>> result = contests.stream().sorted((o1, o2) -> {
        if (o1.get(1) > o2.get(1) ||
            (o1.get(1).equals(o2.get(1)) && o1.get(0) > o2.get(0))) {
            return -1;
        } else if (o1.get(1) < o2.get(1) ||
            (o1.get(1).equals(o2.get(1)) && o1.get(0) < o2.get(0))) {
            return 1;
        }
        return 0;
    }).collect(Collectors.toList());

或

代码语言:javascript
复制
contests.sort((o1, o2) -> {
                if (o1.get(1) > o2.get(1) ||
                    (o1.get(1).equals(o2.get(1)) && o1.get(0) > o2.get(0))) {
                    return -1;
                } else if (o1.get(1) < o2.get(1) ||
                    (o1.get(1).equals(o2.get(1)) && o1.get(0) < o2.get(0))) {
                    return 1;
                }
                return 0;
            });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35761864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档