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进行排序?
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)
要比较包含时间戳记的字符串,您需要首先将它们解析为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)