对包含Java

时间:2017-05-09 09:17:49

标签: java sorting arraylist

我有一个像arrlist =[obj1, obj2,obj3]这样的对象的arraylist,其中每个对象包含epochs和一个整数,即obj_i = {"1493275005401", 2} for all i。我想在时代的基础上对arraylist进行排序。作为java的初学者,我不知道该怎么做。

注意:我做了一些谷歌搜索,提出Collections.sort(),但我不知道如何判断排序对对象的特定字段进行排序。

感谢任何帮助。

编辑:如果我将epoch(TIME)视为string而不是time.,是否会更改已排序的输出?

3 个答案:

答案 0 :(得分:2)

您可以将Collections.sort与比较器一起使用,请考虑您:

List<Item> arrlist = Arrays.asList(new Item("1493275005401", 2), new Item("14932", 5), 
    new Item("778888", 1));

如果您想使用第一个可以使用String的项目进行排序:

Collections.sort(arrlist, (o1, o2) -> {
    return o1.getName().compareTo(o2.getName());
});

如果你想使用第二个项目进行排序,那么你可以使用:和

Collections.sort(arrlist, (o1, o2) -> {
    return o1.getId() - o2.getId();
});

注意:您还可以使用多个主题对列表进行排序。

修改

因为epoch是一个整数,你可以将它转换为BigInteger并比较你的日期:

Collections.sort(arrlist, (o1, o2) -> {
    return new BigInteger(o1.getName()).compareTo(new BigInteger(o2.getName()));
});

答案 1 :(得分:1)

您可以使用Collections.sort(List<T>, Comparator<T>)执行此操作。您只需指定使用数据类型的Comparator组件的epoch

让我们假设你的类型看起来像这样(epoch似乎是一个字符串):

class Container {
  String epoch;
  Integer i;
  Container(String e, Integer ii){
    epoch = e;
    i = ii;
  }
}

然后你可以创建一个比较纪元字符串的数字(!)值的比较器:

class ContComparator implements Comparator<Container> {
  @Override
  public int compare(Container o1, Container o2) {
    final Long epoch2 = Long.valueOf(o2.epoch);
    final Long epoch1 = Long.valueOf(o1.epoch);
    return epoch1.compareTo(epoch2);
  }
}

并像这样使用它:

List<Container> arrlist = ... ;
Collections.sort(arrlist, new ContComparator());

答案 2 :(得分:0)

尝试比较器:

list.sort(Comparator.comparing(obj -> Long.parseLong(obj.getEpoch())));

这是Java 8引入的较新语法和Comparator API。comparing方法将函数作为参数,从列表中的元素中提取相关属性。

如果您阅读Comparator的comparing方法的JavaDoc,您将找到有关如何进一步修改排序的更多信息。

为了更好地了解正在发生的事情:

list.sort(new Comparator<MyObject>() {
    public int compare(MyObject o1, MyObject o2) {
        return Long.parseLong(o1.getEpoch().toMillis()) - Long.parseLong(o2.getEpoch().toMillis());
    }
})