我想知道是否有办法对自定义对象的Arraylist进行排序以适应下面解释的情况?我假设我必须写一个自定义比较器。
假设我有一个如下所示的对象类:
public class Person {
private String status; //options: Online, Away, Offline
private String name; //Person's name
private Date date; //Last signed on
//basic constructor
public Person() {
//set default values
}
//constructor to set all variables
public Person(String s, String n, Date d) {
status = s;
name = n;
date = d;
}
//setters & getters for each of the fields
}
基于姓名和日期的排序应该相当容易。但是,我想知道我将如何根据状态进行排序?我希望能够根据此人在线以及离线的人来对我的阵列进行排序。我不太关心谁不在。
上面的类只是一个示例类。我的实际班级有一个JLabel根据状态设置一个图标。 setText()
仍未使用。我想到了将标签设置为0,1和2的可能性,并且只使用了典型的整数比较器,但我不确定这是否是一种建议的方式。
我肯定在这里错过了一个明显的解决方案,所以也许评论或链接可以提供必要的信息。我知道在这里有很多'排序Arraylist'线程,我浏览了很多。他们中的大多数只是按字母顺序排序字符串或整数。
答案 0 :(得分:4)
如果我理解正确你基本上想要对2个字段进行排序 - 主要字段是状态(因此具有相同状态的人聚集在一起)然后,在每个具有相同状态的人群中,按名称。
执行此操作的比较器如下所示:
public class CompositePersonComparator implements Comparator<Person> {
@Override
public int compare(Person a, Person b) {
//1st and foremost - see if they are not of the same status.
int statusComparison = a.getStatus().compareTo(b.getStatus());
if (statusComparison!=0) return statusComparison;
//logical else - same status, sort by name
return a.getName().compareTo(b.getName());
}
}
答案 1 :(得分:1)
使用枚举在这里很有用
enum MyEnum { ONLINE, AWAY, OFFLINE;}
答案 2 :(得分:1)
我建议我们将状态处理为枚举数据类型而不是String,它只能是少数几个字符串中的一个。这使得编写可读的compareTo方法变得容易:
public class Person implements Comparable<Person> {
private Status currentStatus;
private String name; //Person's name
private Date date; //Last signed on
enum Status {ONLINE, AWAY, OFFLINE};
//basic constructor
public Person() {
//set default values
}
//constructor to set all variables
public Person(Status s, String n, Date d) {
currentStatus = s;
name = n;
date = d;
}
/**
* Order the Persons first by status where all ONLINE Persons are listed first.
*/
@Override
public int compareTo(Person other) {
if(other.currentStatus == currentStatus)
return name.compareTo(other.name);
return currentStatus.ordinal() - other.currentStatus.ordinal();
}
}