Java 类对象定义排序行为

Java 类对象定义排序行为,java,sorting,collections,Java,Sorting,Collections,抱歉,如果这是一个微不足道的问题,但我对java非常陌生,但我已经研究了ArrayList和集合。我想我需要收藏,但我不熟悉,我想在这里问一下 我研究了接口,但我不确定这是否是我需要去的地方。我可能问了一个重复的问题,但我试着在谷歌上搜索重载的排序运算符java或用户对象可排序列表等。。我可能遗漏了一个关键的java术语 假设我有一个用户定义的类型 class UserObject { private long timestamp; private String thin

抱歉,如果这是一个微不足道的问题,但我对java非常陌生,但我已经研究了ArrayList和集合。我想我需要收藏,但我不熟悉,我想在这里问一下

我研究了接口,但我不确定这是否是我需要去的地方。我可能问了一个重复的问题,但我试着在谷歌上搜索重载的排序运算符java或用户对象可排序列表等。。我可能遗漏了一个关键的java术语

假设我有一个用户定义的类型

class UserObject {
      private long timestamp;
      private String thing;
      private String otherthing;
      public UserObject(long ts) { timestamp = ts ); 
}
是否有一个数据容器可以保存用户对象并根据私有成员时间戳对其进行排序?在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
类用户对象{
...
公共布尔lessThan(UserObject rhs){
返回时间戳
使您的类实现
可比较的接口:

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);
    }
}
这可以作为第二个参数传递给
sort()

listl=newarraylist();
sort(l,newuserobjectcomp());

使您的类实现
可比较的接口:

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);
    }
}
这可以作为第二个参数传递给
sort()

listl=newarraylist();
sort(l,newuserobjectcomp());

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

+1使用
Long.compare()
!这实际上是比较两个long的正确方法。不过,有一件事在Java:p中不需要使用
self
,而且,您的注释是不精确的:比较实际上返回的值将严格小于(或大于)0,它不必返回-1或1。@fge有效点,已更新+1用于使用
Long.compare()
!这实际上是比较两个long的正确方法。不过,有一件事在Java:p中不需要使用
self
,而且,您的注释是不精确的:比较实际上返回的值将严格小于(或大于)0,它不必返回-1或1。@fge有效点,已更新!
List<UserObject> l = new ArrayList<>();
Collections.sort(l, new UserObjectComp());