Java:如何按其大小对列表的列表进行排序?

15
我有9个不同的ArrayList,我想要一个包含前5个的列表。
我考虑按它们的大小对这些ArrayList进行排序。
这是否可行?如果是,我该如何实现?
经过几次尝试,我终于让它工作了,想与所有人分享。
最好获取ArrayList的大小并将其添加到大的ArrayList中。
// creates an ArrayList that holds ArrayLists 
List allTheLists = new ArrayList(); 
allTheLists.add(pbaustraliaList.size());
allTheLists.add(pbotherList.size()); 
allTheLists.add(pbunitedStatesList.size()); 
allTheLists.add(pbunitedKingdomList.size()); 
allTheLists.add(pbchinaList.size()); 
allTheLists.add(pbgermanyList.size()); 
allTheLists.add(pbindiaList.size()); 
allTheLists.add(pbjapanList.size()); 
allTheLists.add(pbsingaporeList.size()); 
Comparator comparator = Collections.reverseOrder();
Collections.sort(allTheLists,comparator);

//display elements of ArrayList    
System.out.println("ArrayList elements after sorting in descending order : ");    
for(int i=0; i<allTheLists.size(); i++) {     
    System.out.println(allTheLists.get(i));   
}

你想要最短的列表排在最前面,最长的排在最后面吗? - cHao
刚刚看了Justin的一个例子,我会先试一下。谢谢大家 =) - user419596
3个回答

30

您可以按照以下步骤进行操作:

// this List of lists will need to contain 
// all of the ArrayLists you would like to sort
List<ArrayList> allTheLists; 
Collections.sort(allTheLists, new Comparator<ArrayList>(){
    public int compare(ArrayList a1, ArrayList a2) {
        return a2.size() - a1.size(); // assumes you want biggest to smallest
    }
});

这将按每个列表的长度对列表进行排序。 排序后的第一个元素将是最长的列表,而最后一个元素将是最短的列表。
然后,您可以遍历前5个列表以查看前5个是什么。
一些参考链接:
- 排序教程 - 集合 Javadoc - 比较器 Javadoc

根据您存储ArrayLists的方式,创建List<ArrayList>的代码应该类似于:

// creates an ArrayList that holds ArrayLists
List<ArrayList> allTheLists = new ArrayList<ArrayList>();
allTheLists.add(yourList1);
allTheLists.add(yourList2);
...
allTheLists.add(yourList9);

1
+1,但我会使用List而不是ArrayList作为类型参数。 - pcjuzer
@pcjuzer,谢谢。我也想这样做。但这是根据问题的需求量身定制的。 - jjnguy
2
将所有 ArrayList 实例更改为 List<?> 在这种特定情况下同样有效,而且更具可扩展性并避免了原始类型警告。 - Andrzej Doyle

0

你也可以这样做

public static <T> List<List<T>> sort(List<List<T>> list) {
        list.sort((xs1, xs2) -> xs1.size() - xs2.size());
        return list;
    }

0

List 上可用的 sort 方法需要一个 Comparator。该比较器可以使用 Comparator.comparing 方法创建,还包括用于提取和比较 int 的其他特殊实现 - Comparator.comparingInt

import static java.util.Comparator.comparingInt;
...
List<List<Integer>> listOfLists = ...
listOfLists.sort(comparingInt(List::size));

List::size 将把 List 映射到一个 int(列表的大小),并使用它来创建一个新的 Comparator,以便用于我们的排序目的。

如果您想要最大的排在前面

listOfLists.sort(comparingInt(List::size).reversed());

将前5个元素转储(切换到Java 8流):

listOfLists.stream()
  .sorted(comparingInt(List::size).reversed())
  .limit(5)
  .forEachOrdered(System.out::println);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接