0

コンパレータを書くのに助けが必要です:-

私はこの出力が欲しい:-

Martin Joseph Male 4/2/1979 Green 
Ramya  Patil  Female 5/4/2009 Red
Don    kelly  Male   5/6/1986 Yellow
Van    Shinde female 3/4/1984 Green

しかし、私は次の出力を得ています:-

Output 1:
 Van    Shinde female 3/4/1984 Green
 Don    kelly  Male   5/6/1986 Yellow
 Ramya  Patil  Female 5/4/2009 Red
 Martin Joseph Male 4/2/1979 Green 

リストの順序をそのままに姓でソートするにはどうすればよいですか..つまり、女性を最初に姓でソートし、次に男性を姓でソートして出力したいということです...助けてください..

これは、性別コンパレーターを使用した後に使用しているコンパレーターです:-

public class LastNameComparator implements Comparator<Person> {


public int compare(Person name_one, Person name_two) {
        // TODO Auto-generated method stub
        if(name_one.getGender().equals(name_two.getGender())){
            return name_one.getLast_name().compareTo(name_two.getLast_name());

        }else{
        return name_one.getLast_name().compareTo(name_two.getLast_name());
        }
    }

}
4

5 に答える 5

4
public int compare(Person a, Person b) {
  int ret = a.getGender().compareTo(b.getGender());
  if (ret == 0) {
    ret = a.getLastName().compareTo(b.getLastName());
  }
  return ret;
}
于 2009-10-13T01:29:54.363 に答える
1

ここではCletusのソリューションがおそらく最も適切ですが、もう少し詳しく知りたい場合は...

LastNameComparator実際には性別と姓を比較しているため、誤解を招くような名前が付けられています。この機能を2つの別々に分割することはそれほど曖昧ではないかもしれませんComparators

class GenderComparator implements Comparator<Person> {
    public int compare(Person a, Person b) {
        return a.getGender().compareTo(b.getGender());
    }
}

class LastNameComparator implements Comparator<Person> {
    public int compare(Person a, Person b) {
        return a.getLastName().compareTo(b.getLastName());
    }
}

次に、機能を「カスタム」に組み合わせますComparator

Comparator<Person> genderThenLastNameComparator = new Comparator<Person>() {
    public int compare(Person a, Person b) {
        int result = new GenderComparator().compare(a, b);
        return result == 0 ? new LastNameComparator().compare(a, b) : result;
    }
}

より複雑ですが、より柔軟で再利用可能です。(このような単純なケースでは、どちらが正当化される場合とされない場合があります。)

于 2009-10-13T01:48:49.537 に答える
1

OPのコードを読むと、姓で比較した結果を常に返していることがわかります。

If genders are equal
  then compare last names
  else compare last names

ただし、それはあなたが得ていると言う実験結果とはあまり関係ありません。そのため、Cletus の提案に合わせてコードを変更するだけでなく、コードにも何か問題がある可能性があります。

于 2009-10-13T01:34:54.277 に答える
0
于 2009-10-13T01:31:56.263 に答える
0

これは比較的単純なはずです。

指定したルールは次のとおりです。

  • 男性の前に女性
  • 姓の昇順で並べ替えられた名前

あなたはこのようなことをします:

// if the genders are not equal, return <0 if this object's gender is female
// else 
//    return lastName.compareTo( obj.lastName );

このコンパレータを実装するために必要なのはそれだけです...

並べ替えたいときは、コレクション フレームワークの並べ替えを使用してください。

public static <T> void sort(List<T> list,
                            Comparator<? super T> c)

これも安定した並べ替えです...これは素晴らしいです。このように答えれば、きっとあなたは仕事を得るでしょう。

于 2009-10-15T17:13:52.310 に答える