首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对一列物品进行排序?

问如何对一列物品进行排序?
EN

Stack Overflow用户
提问于 2014-04-13 06:08:52
回答 4查看 3.5K关注 0票数 3

我有个课

代码语言:javascript
复制
public class SMS 
{
    public String addr;
    public String body;
    public String type;
    public String timestamp;
}

现在我已经做了一个对象的arrayList

代码语言:javascript
复制
ArrayList<SMS> temp = new ArrayList<SMS>();

我增加了价值。现在,我想按照时间戳对arrayList进行排序。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-13 06:23:43

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

所以不妨试着用Collections.sort(yorList, yourOwnComparator)

代码语言:javascript
复制
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));
    }
});

如果您可以将时间戳类型更改为long,则此代码如下所示

代码语言:javascript
复制
Collections.sort(temp, new Comparator<SMS>() {
    @Override
    public int compare(SMS o1, SMS o2) {
        return Long.compare(o1.timestamp, o2.timestamp);
    }
});

在Java8中,您甚至可以使用lambda来缩短代码。

代码语言:javascript
复制
Collections.sort(temp, (SMS o1, SMS o2) -> Long.compare(o1.timestamp, o2.timestamp));

甚至是

代码语言:javascript
复制
Collections.sort(temp, (o1,  o2) -> Long.compare(o1.timestamp, o2.timestamp));
票数 5
EN

Stack Overflow用户

发布于 2014-04-13 06:09:48

代码语言:javascript
复制
Collections.sort(temp);

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

代码语言:javascript
复制
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 );
    }
}

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

代码语言:javascript
复制
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();
    }
}
票数 8
EN

Stack Overflow用户

发布于 2014-04-13 06:14:31

使用Comparable (请参阅这里的例子),应该如下所示:

代码语言:javascript
复制
public class SMS implements Comparable<SMS>{

    ....

    public int compareTo(SMS compareSms) { 
        return this.timestamp.compareTo(compareSms.timestamp);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23039744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档