在三个对象之后对列表<object []>进行排序

时间:2017-07-19 09:18:39

标签: java sorting collections

我有一个列表List<Object[]>

Object []具有以下对象:

  • 日期“dd.MM.yyyy”
  • 字符串
  • 日期“HH:mm”。

我可以在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;
    }
});

我怎样才能让它发挥作用?

3 个答案:

答案 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