如何对对象的arylylist进行排序?

air*_*rne 2 java sorting arraylist

我上课了

public class SMS 
{
    public String addr;
    public String body;
    public String type;
    public String timestamp;
}
Run Code Online (Sandbox Code Playgroud)

现在我已经创建了一个对象的数组列表

ArrayList<SMS> temp = new ArrayList<SMS>();
Run Code Online (Sandbox Code Playgroud)

我添加了值.现在我想根据时间戳对arrayList进行排序.

如何根据时间戳以升序/降序对arrayList进行排序?

Sni*_*las 7

Collections.sort(temp);
Run Code Online (Sandbox Code Playgroud)

将对一组Comparable对象进行排序,因此类 SMS必须实现Comparable<SMS>:

public class SMS implementes Comparable<SMS>
{
    public String addr;
    public String body;
    public String type;
    public String timestamp;

    @Override
    public int compareTo(SMS other) {
       //for instance
       return addr.compareTo( other.addr );
    }
}
Run Code Online (Sandbox Code Playgroud)

这通常是一种很好的做法,在实现Comparable时也要实现equals(),hashcode()以便对象之间的相等性与它们的比较一致.此外,您应该添加一些针对空值的保护:

public class SMS implements Comparable<SMS>
{
    public String addr;
    public String body;
    public String type;
    public String timestamp;

    @Override
    public int compareTo(SMS other) {
       //for instance
       if( addr == null ) {
           return Integer.MAX_VALUE;
       }
       return addr.compareTo( other.addr );
    }

    @Override
    public boolean equals(Object other) {
       //for instance
       if( other instanceof SMS ) {
          if( addr == null && ((SMS) other) != null ) {
              return false;
          }
          return addr.equals(((SMS) other).addr);
       } else {
          return false;
       }
       return addr.compareTo( other.addr );
    }

    @Override
    public int hashcode() {
       //for instance
       if( addr == null ) {
           return 0;
       }
       return addr.hashcode();
    }
}
Run Code Online (Sandbox Code Playgroud)


Psh*_*emo 5

要比较包含时间戳记的字符串,您需要首先将它们解析为long Long.parseLong(timestamp),然后使用来比较数值Long.compare(x,y)

所以尝试Collections.sort(yorList, yourOwnComparator)

Collections.sort(temp, new Comparator<SMS>() {
    @Override
    public int compare(SMS o1, SMS o2) {
        return Long.compare(Long.parseLong(o1.timestamp), 
                            Long.parseLong(o2.timestamp));
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您可以将时间戳记类型更改long为此代码,则可能看起来像

Collections.sort(temp, new Comparator<SMS>() {
    @Override
    public int compare(SMS o1, SMS o2) {
        return Long.compare(o1.timestamp, o2.timestamp);
    }
});
Run Code Online (Sandbox Code Playgroud)

在Java8中,您甚至可以使用Lambda缩短代码长度

Collections.sort(temp, (SMS o1, SMS o2) -> Long.compare(o1.timestamp, o2.timestamp));
Run Code Online (Sandbox Code Playgroud)

甚至

Collections.sort(temp, (o1,  o2) -> Long.compare(o1.timestamp, o2.timestamp));
Run Code Online (Sandbox Code Playgroud)