2

以下で説明する状況に合うようにカスタムオブジェクトの配列リストを並べ替える方法があるかどうか疑問に思っていますか?カスタムコンパレータを作成する必要があると思います。

次のようなオブジェクトクラスがあるとします。

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の値に設定し、一般的な整数コンパレータを使用する可能性を考えましたが、それが推奨される方法であるかどうかはわかりませんでした。

確かに私はここで明白な解決策を見逃しているので、おそらくコメントやリンクが必要な情報を提供することができます。私はここSOにたくさんの「SortArraylist」スレッドがあることを知っています、そして私はそれらの多くを閲覧しました。それらのほとんどは、文字列をアルファベット順または整数でソートしているだけです。

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

ここで列挙型を使用すると便利です enum MyEnum { ONLINE, AWAY, OFFLINE;}

于 2013-03-19T19:49:06.180 に答える
1

ステータスを、数少ない文字列の1つにしかなり得ない文字列ではなく、列挙型のデータ型として処理することをお勧めします。これにより、読みやすい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();
  }
}   
于 2013-03-19T19:53:47.403 に答える