有没有一种简单的方法以这种方式对arraylist进行排序?

时间:2013-03-19 19:38:45

标签: java sorting collections arraylist

我想知道是否有办法对自定义对象的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'线程,我浏览了很多。他们中的大多数只是按字母顺序排序字符串或整数。

3 个答案:

答案 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();
  }
}