我有一个列表List<Object[]>
。
Object []具有以下对象:
我可以在dd.MM.yyyy
之后,然后在String
之后对列表进行排序。现在我想在时间之后对它进行排序,结果也应该排序“dd.MM.yyyy”,排序“字符串”,排序“时间”。
Collections.sort(resultList, new Comparator<Object[]>() {
public int compare(Object[] o1, Object[] o2) {
int dateComparison = (( o2[0]).compareTo(o1[0]));
return dateComparison == 0 ? ( o1[1]).compareTo( o2[1]) : dateComparison;
}
});
我怎样才能让它发挥作用?
答案 0 :(得分:6)
你的问题是:错误的抽象。
如果您拥有属于的“数据”,则将其转换为类。
含义:您不是将三个列表与数据保持在一起,而是创建一个合理地“包裹”这三个信息的类。然后你创建一个类的数组/列表。
因为这样您可以轻松创建不同的比较器对象,比较该类的对象 - 例如,查看不同的字段。
换句话说:您(或多或少)使用平面数据编写“程序”代码,以及“组合”平面数据的“外部”代码。但是当使用诸如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;
(显然你需要在这里和那里进行一些演员表,但是由于你的输入没有使用它们,我也把它排除在外)
答案 1 :(得分:3)
试试这个。
resultList.sort(
Comparator.comparing((Object[] a) -> (Date)a[0])
.thenComparing(a -> (String)a[1])
.thenComparing(a -> (Date)a[2]));
答案 2 :(得分:-1)
将Date和Time对象合并为java.util.Date,然后使用String作为HashMap中的键。在这里,您可以先通过获取日期对List<HashMap<String, Date>
进行排序,然后使用compareTo()
比较字符串键。
正如旁注:如果您使用的是数组列表或列表列表,那么它可能是code smell。