Java 排序列表<;对象[]>;三个物体之后

Java 排序列表<;对象[]>;三个物体之后,java,sorting,collections,Java,Sorting,Collections,我有一个列表list 对象[]具有以下对象: 日期“年月日” 串 日期“HH:mm” 我可以将列表排序在dd.MM.yyyy之后,然后排序在字符串之后。现在我想在时间之后对它进行排序,结果也应该排序为“dd.MM.yyyy”,排序为“String”,排序为“time” Collections.sort(resultList,newcomparator(){ 公共整数比较(对象[]o1,对象[]o2){ int dateComparison=((o2[0])。comparieto(o1[0])

我有一个列表
list

对象[]具有以下对象:

  • 日期“年月日”
  • 日期“HH:mm”
我可以将列表排序在
dd.MM.yyyy
之后,然后排序在
字符串之后。现在我想在时间之后对它进行排序,结果也应该排序为“dd.MM.yyyy”,排序为“String”,排序为“time”

Collections.sort(resultList,newcomparator(){
公共整数比较(对象[]o1,对象[]o2){
int dateComparison=((o2[0])。comparieto(o1[0]);
返回日期比较==0?(o1[1])。比较到(o2[1]):日期比较;
}
});

如何使其工作?

将日期和时间对象合并为一个,然后使用字符串作为哈希映射中的键。从这里,您可以对
列表进行排序您的问题是:错误的抽象

当您拥有属于一起的“数据”时,您可以将其转换为类

意思是:您创建一个类来合理地“包装”这三条信息,而不是用数据保存三个列表。然后创建该类的数组/列表

因为这样您就可以轻松地创建不同的Comparator对象来比较该类的对象,例如通过查看不同的字段

换句话说:您(或多或少)正在使用平面数据编写“过程”代码,以及“组合”平面数据的“外部”代码。但是当使用Java之类的OO语言时,您应该努力创建有用的抽象

但如果您想继续使用您的方法,请查看以下伪代码:

int dateComparison = o2[0].compareTo(o1[0]);
if (dateComparison != 0) return dateComparison;

int stringComparison = o2[1].compareTo(o1[1]);
if (stringComparison != 0) return stringComparison;

int secondDateComparison = o2[2].compareTo(o1[2]);
return dateComparison;
(很明显,您需要在这里或那里进行一些强制转换,但由于您的输入没有使用它们,因此我也省略了这一点)

试试这个

resultList.sort(
    Comparator.comparing((Object[] a) -> (Date)a[0])
        .thenComparing(a -> (String)a[1])
        .thenComparing(a -> (Date)a[2]));

你的实际问题是什么?您需要添加另一个比较请详细说明或提供示例/用例。如果这些只是对象,您如何调用
compareTo
?不要使用
Object[]
,尤其是这样。看起来每个对象数组都应该是一个类的实例。创建一个包含三个字段的类Foo,然后创建一个
列表
。然后,您可以创建允许您调用
集合。排序
,而无需指定比较器。@tobias_k很好。这一点,加上
o2[0]
o2[1]
周围有奇怪的多余括号,让我怀疑他们编辑了一个演员阵容。索引
1
中的
字符串
元素呢?为了记录在案:我还添加了“直接”答案部分。很好。我总是惊讶地发现,使用lambdas可能会有什么有趣(且易于理解!)的解决方案!
resultList.sort(
    Comparator.comparing((Object[] a) -> (Date)a[0])
        .thenComparing(a -> (String)a[1])
        .thenComparing(a -> (Date)a[2]));