如何根据自定义所需顺序对包含列表的数组列表进行排序
Posted
技术标签:
【中文标题】如何根据自定义所需顺序对包含列表的数组列表进行排序【英文标题】:How to sort array list contains list as elements based on custom required order 【发布时间】:2021-12-15 02:10:17 【问题描述】:我有一个数组列表,类似于List<List<Integer>> res = new ArrayList();
经过一些处理后,我的 res 数组列表将包含
[1, 1, 2]
[1, 1]
[1, 2]
[1]
[2]
这些元素,但我想要排序的顺序,看起来像
[1]
[1 1]
[1 1 2]
[1 2]
[2]
所以我所做的是
Collections.sort(res,new Comparator<List<Integer>>()
public int compare(List<Integer> o,List<Integer> s)
int c=0;
//c=o.size().compareTo(s.size());
//if(c==0)
for(int i=0;i<Math.min(s.size(),o.size());i++)
c=o.get(i).compareTo(s.get(i));
if(c!=0) return c;
//
return c;
);
但它不起作用
【问题讨论】:
在compare
方法中放一个断点,看看一些比较是什么样的。或者只是在纸上计算 [1] 和 [1 2] 之间的比较结果。
【参考方案1】:
尝试比较列表的大小,而不是只在compare
末尾返回c
:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Main
public static void main(String[] args)
List<List<Integer>> list = new ArrayList<>();
list.add(new ArrayList<>(Arrays.asList(1, 1, 2)));
list.add(new ArrayList<>(Arrays.asList(1, 1)));
list.add(new ArrayList<>(Arrays.asList(1, 2)));
list.add(new ArrayList<>(Arrays.asList(1)));
list.add(new ArrayList<>(Arrays.asList(2)));
System.out.printf("Before: %s%n", list);
Collections.sort(list, new Comparator<List<Integer>>()
public int compare(List<Integer> o, List<Integer> s)
for (int i = 0; i < Math.min(o.size(), s.size()); i++)
int c = o.get(i).compareTo(s.get(i));
if (c != 0)
return c;
return Integer.compare(o.size(), s.size());
);
System.out.printf("After: %s%n", list);
输出:
Before: [[1, 1, 2], [1, 1], [1, 2], [1], [2]]
After: [[1], [1, 1], [1, 1, 2], [1, 2], [2]]
【讨论】:
以上是关于如何根据自定义所需顺序对包含列表的数组列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章