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.