有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不同长度的ArrayList的Java排序列表(按大小,以asc或desc为单位)

我有以下代码:

List<ArrayList<Integer>> tree = new ArrayList<ArrayList<Integer>>();`
tree.add(new ArrayList<Integer>(Arrays.asList(4,5,6)));`
tree.add(new ArrayList<Integer>(Arrays.asList(2,3)));
tree.add(new ArrayList<Integer>(Arrays.asList(1)));       
tree.add(new ArrayList<Integer>(Arrays.asList(1,2, 3)));
tree.add(new ArrayList<Integer>(Arrays.asList(1,2)));
tree.add(new ArrayList<Integer>(Arrays.asList(5)));
tree.add(new ArrayList<Integer>(Arrays.asList(5,6)));
System.out.println(tree);

它返回结果:

[[4, 5, 6], [2, 3], [1], [1, 2, 3], [1, 2], [5], [5, 6]]

我想根据数字位置的值及其长度在asc或desc中对其进行排序,并希望得到结果:
*asc:[1], [1, 2], [1, 2, 3], [2, 3], [4, 5, 6], [5], [5, 6]
*描述:[5, 6], [5], [4, 5, 6], [2, 3], [1, 2, 3], [1, 2], [1]

请帮忙


共 (2) 个答案

  1. # 1 楼答案

    您可以使用Java 8中的Comparator,首先比较列表中的元素,然后比较大小:

    tree.sort(Comparator.comparing((List<Integer> list) -> list.stream()
                                .map(a -> Integer.toString(a))
                                .collect(Collectors.joining()))
                         .thenComparing(List::size));
    

    对于反向排序,只需在比较器末尾添加.reversed()

    tree.sort(Comparator.comparing((List<Integer> list) -> list.stream()
                                .map(a -> Integer.toString(a))
                                .collect(Collectors.joining()))
                            .thenComparing(List::size).reversed());
    
  2. # 2 楼答案

    你能试试这个密码吗我还没有测试它
    在某些情况下,它可能会对其进行反向排序,但这是您应该执行的逻辑

    List<ArrayList<Integer>> tree = new ArrayList<ArrayList<Integer>>();
            tree.add(new ArrayList<Integer>(Arrays.asList(4,5,6)));
            tree.add(new ArrayList<Integer>(Arrays.asList(2,3)));
            tree.add(new ArrayList<Integer>(Arrays.asList(1)));       
            tree.add(new ArrayList<Integer>(Arrays.asList(1,2, 3)));
            tree.add(new ArrayList<Integer>(Arrays.asList(1,2)));
            tree.add(new ArrayList<Integer>(Arrays.asList(5)));
            tree.add(new ArrayList<Integer>(Arrays.asList(5,6)));
            System.out.println(tree);
            Collections.sort(tree, new Comparator<ArrayList<Integer>>() {
                @Override
                public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
                    int minSize = Math.min(o1.size(), o2.size());
                    for(int i =0 ; i< minSize;i ++) {
                        //to compare element in inner list
                        if(o1.get(i).compareTo(o2.get(i)) != 0){
                            return o1.get(i).compareTo(o2.get(i));
                        }
                    }
                    //if all elements are the same to same index, return o2 as smaller list
                    if(o1.size() > o2.size()) {
                        return 1;
                    }else{
                        return -1;
                    }
                }
            });