简体   繁体   中英

Java Sort List of ArrayList of difference length by its size in asc or desc

I have the following code:

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

It return the result:

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

I want to sort it in asc or desc based on value of digit position and its length and want the result:
* asc: [1], [1, 2], [1, 2, 3], [2, 3], [4, 5, 6], [5], [5, 6]
* desc: [5, 6], [5], [4, 5, 6], [2, 3], [1, 2, 3], [1, 2], [1]

Please help!

Could you please try this code? I haven't test it yet!
It might sort it reversed in some cases, but this is the logic you should do.

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

You can use the Comparator from Java 8, first compare the elements of the list, then the size:

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

For reversed sorting, just add the .reversed() at the end of comparator:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM