簡體   English   中英

Java 排序列表列表

[英]Java Sort List of Lists

如何使用 Collections.sort() 或其他排序方法按字典順序對 Java 中的列表列表進行排序?

private List<List<Integer>> possiblePoles = setPoles();    
System.out.println(possiblePoles)
[[1, 3, 5], [1, 2, 3]]

您必須實現自己的Comparator類並將實例傳遞給Collections.sort()

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());
  }

}

然后排序很容易

List<List<Integer>> listOfLists = ...;

Collections.sort(listOfLists, new ListComparator<>());

使用 Java 8 流 API 改進 MartinS 答案

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());

對於這個例子 [[1, 3], [1, 2]],如果你想按兩個元素對列表進行排序,你可以使用 sorted from Java 8 手動實現的比較器方法,驗證所有情況,如下例所示:

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());

或者

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;
            });
  possiblePoles.sort((l1, l2) -> {
        int minLength = Math.min(l1.size(), l2.size());
        for (int i = 0; i < minLength; i++) {
            int lexicographicalPosition = l1.get(i).compareTo(l2.get(i));
            if (lexicographicalPosition != 0) {
                return lexicographicalPosition;
            }
        }
        return Integer.compare(l1.size(), l2.size());
    });

與 java 8 相同的邏輯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM