我有一个清单:
List<List<Item>> = [["a","one",3],["b",2],["c",4],["d","two",["e",1],["f",1]]
我想用子数组中的第二个值对它进行排序,如果有两个像,那么它应该按第三个值排序,如果它从那里找到两个,那么它应该按第一个元素排序.
所以最终结果应该是这样的:
[["e",["a",2]]
有人能告诉我一些好方法吗?
谢谢!
解决方法
[“a”,“one”,3]应该是你班级的实例
class Item{ private String val1; private String val2; private int val3; //getters and setters }
这样您的列表就是List< Item>.现在您可以使用Collections.sort(list,yourComparator)或者使用Java 8 list.sort(yourComparator).
作为yourComparator,您可以传递实现Comparator接口的类的实例,例如以某种方式
Comparator<Item> yourComparator = new Comparator<Item>() { @Override public int compare(Item o1,Item o2) { //comapre val2 int result = o1.getVal2().compareto(o2.getVal2()); if (result != 0) return result; //if we are here val2 in both objects ware equal (result was 0) result = Integer.compare(o1.getVal3(),o2.getVal3()); if (result != 0) return result; return o1.getVal1().compareto(o2.getVal1()); } };
但是可能更具可读性且可能更容易的方法是为每个字段创建单独的比较器并将它们组合起来.如果您使用的是Java 8,则代码可能如下所示:
Comparator<Item> val1Comparator = Comparator.comparing(Item::getVal1); Comparator<Item> val2Comparator = Comparator.comparing(Item::getVal2); Comparator<Item> val3Comparator = Comparator.comparingInt(Item::getVal3); list.sort(val2Comparator .thenComparing(val3Comparator) .thenComparing(val1Comparator));