类对象定义排序行为

时间:2016-03-30 16:42:21

标签: java sorting collections

很抱歉,如果这是一个微不足道的问题,但我对java很新,但我已经查看了ArrayLists和Collections。我认为一个集合在某种程度上是我需要去的,但我不熟悉,想在这里问一下。

我查看了comparable接口,但我不确定这是我需要去的地方。我可能会问一个重复的问题,但我已经尝试使用谷歌搜索重载的排序操作符java或用户对象可排序列表等。我可能错过了一个关键的java术语。

我们说我有一个用户定义的类型

class UserObject {
      private long timestamp;
      private String thing;
      private String otherthing;
      public UserObject(long ts) { timestamp = ts ); 
}

是否有一个数据容器可以容纳UserObject并根据私有成员时间戳对它们进行排序?在lua我可以编辑表元方法值,我认为在C ++中你可以重载相等运算符。

我所做的事情:

class UserObject {
    ...
    public boolean lessThan(UserObject rhs) {
        return timestamp < rhs.timestamp;
    }
}

ArrayList<UserObject> MyObjects;
for( int i = 0; i < 10; i++ ) {
    MyObjects.add(new UserObject(10-i))
}

Collections.sort(MyObjects); //should invert the order

2 个答案:

答案 0 :(得分:4)

让您的类实现Comparable接口:

class UserObject implements Comparable<UserObject> {
    private long timestamp;
    ...

    // returns int < 0 (this before o), int > 0 (o before this), or 0 
    public int compareTo(UserObject o) { 
        return Long.compare(this.timestamp, o.timestamp);
    }
}

然后,您可以通过List<UserObject>对任何s实施集合Collections.sort(s)进行排序。

实施Comparable界面可让您的课程成为一个“自然”的界面。订购。如果您需要任何其他订单,可以编写自定义Comparator

public class UserObjectComp implements Comparator<UserObject> {
    public int compare(UserObject o1, UserObject o2) {
        // return < 0, 0, or > 0 
    }
}

这可以作为第二个参数传递给sort()

List<UserObject> l = new ArrayList<>();
Collections.sort(l, new UserObjectComp());

答案 1 :(得分:0)

是的,有这样一个集合可以为你排序。它被称为TreeSet。您的UserObject类必须实现类似的接口(就像@schwobaseggl用户在他的回答中所示)或者您可以通过传递您自己的Comporator实现来创建您的Set。在以太网情况下,该集将始终保持您的序列排序。请记住,每次修改集合时,它都会执行排序,这可能是性能方面的扩展。因此,您可能希望将收藏集保存在常规列表中,并在需要时使用Collections.sort(s)方法按需对其进行排序