3

私は2つのクラスを持っています

public class PopularSports {    
    public int Rank;    
    public String Sport;
}

public class Medals {
    public String Sport    
    public String Medal    
    public int Year    
    public String Game    
    public String Athlete
}

csvをリードして各クラスのリストに結果を取得しようとすると、次の順序でソートしたいと思います。

PopularSports クラスは、次の順序で並べ替える必要があります。

  1. ランク
  2. スポーツ

Medals クラスは、次の順序で並べ替える必要があります。

  1. スポーツ
  2. メダル
  3. ゲーム
  4. アスリート

このようなコンパクターを作成しました

Collections.sort(medalReportList, new Comparator<Medals >() {
  @Override
  public int compare(Medals o1, Medals o2) {
   return getRankOfSportBySportName(o1.getSport()) > getRankOfSportBySportName(o2.getSport())
          ? +1
          : getRankOfSportBySportName(o1.getSport()) < getRankOfSportBySportName(o2.getSport())
          ? -1
          : o1.getAthlete().compareToIgnoreCase(o2.getAthlete());
    }
  });

しかし、それは実現していません。アスリートの名前を並べ替えています。

4

4 に答える 4

2

これらのチェックをネストする必要があります。PopularSports メソッドを作成し、残りはあなたに任せます。

Javaコーディング標準を学び、それらのクラス名を単数形にすることをお勧めします:PopularSportMedal. 以下にデモンストレーションします。

public int compareTo(PopularSport other) {
    if (this.rank < other.rank) return -1;
    else if (this.rank > other.rank) return +1;
    else {
        // This is where the nesting happens to break the ties.
        if (this.sport.compareTo(other.sport) < 0) return -1;
        else if (this.sport.compareTo(other.sport) > 0) return +1;
        else return 0;  // You'll have deeper nesting for the other values in Medal.
    }
}

選択した順序によって、最初にチェックされるものが決まります。else関係を断ち切るために句にネストします。

于 2013-10-31T14:13:51.440 に答える
0

他の人はすでに三項演算子を使用したソリューションを提供しています。一方、複雑な状況で使用することはお勧めしません。単純に読みにくく、維持するのが難しいからです。

if/else ブロックを使用するか (比較するフィールドが非常に多く、見栄えが悪くなります)、サードパーティのライブラリを使用することをお勧めします。Guavaでは、次のようにComparisionChainを使用できます。

new Comparator<Medals>() {
    @Override
    public int compare(Medals m1, Medals m1) {
        return ComparisonChain.start()
         .compare(m1.getSport(), m2.getSport())
         .compare(m1.getMedal(), m2.getMedal())
         .compare(m1.getYear(), m2.getYear())
         .compare(m1.getGame(), m2.getGame())
         .compare(m1.getAthlete(), m2.getAthlete(), String.CASE_INSENSITIVE_ORDER)
         .result();
    }
}

そのほうが読みやすいじゃないですか!

于 2013-10-31T14:33:20.917 に答える