2

我想知道是否有办法对自定义对象的 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 值并仅使用典型整数比较器的可能性,但我不确定这是否是一种建议的方法。

当然,我在这里缺少一个明显的解决方案,所以也许评论或链接可以提供必要的信息。我知道这里有大量的“排序数组列表”线程,我浏览了很多。他们中的大多数只是按字母顺序或整数排序字符串。

4

3 回答 3

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());
    }
 }
于 2013-03-19T19:42:58.127 回答
1

I suggest we handle the status as an enumerated data type instead of a String where it can only be one of a few strings. This makes it easy to write a readable compareTo method:

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();
  }
}   
于 2013-03-19T19:53:47.403 回答
1

在这里使用枚举可能很有用 enum MyEnum { ONLINE, AWAY, OFFLINE;}

于 2013-03-19T19:49:06.180 回答