按子列表中的项目对Java List进行排序

我有一个清单:

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

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...