0

2 つの名前文字列を比較するために、Java で自己記述のコンパレーターを使用しています。

public class NamesSorter implements Comparator<EntityBean>{
    @Override
    public int compare(EntityBean a1, EntityBean a2) {
       return a1.getName().compareToIgnoreCase(a2.getName());
    }
}

このソーターを使ったメインコード

final Set<EntityBean> treeSet = new TreeSet<EntityBean>(new NamesSorter());
final List<EntityBean> firstListToCompare=display.getAvailablePeople().getItems(); 
final List<EntityBean> SecondListToCompare=display.getAvailablePeople().getItems(); 
treeSet.addAll(firstListToCompare);
treeSet.addAll(secondListToCompare);       

次の入力でこのコードを実行すると

firstListToCompare アメリア、ジョージ、ミーガン

2 番目のリストは、ジョージ ウォッシュ、ファングを比較します。

結果は

アメリア、ファング、ジョージ、ミーガン、ジョージ・ウォッシュ。

コンパレーターに無視されたケースがある場合、なぜジョージ・ウォッシュを最後までプッシュするのですか?

getName メソッド。

public String getName() {名前を返します。}

2 つの文字列の間にスペースがある名前は、George Wash (George と Wash の間にスペースがある) のように、リストの最後になります。

4

2 に答える 2

2

私はあなたが?getName()を返していると仮定しています。に追加してStringみませんか。だから試して...toString()getName()

public int compare(EntityBean a1, EntityBean a2) {
   return a1.getName().toString().compareToIgnoreCase(a2.getName().toString());
}

以下のようにコードを試したところ、正しい出力が得られました...

public class NamesSorter implements Comparator<Object>{
    public int compare(Object arg0, Object arg1) {
        return (arg0.toString()).compareToIgnoreCase(arg1.toString());
    }
}

public static void main(String[] args) {
    Comp comp = new Comp();
    final Set<Object> treeSet = new TreeSet<Object>(comp.new NamesSorter());
    final List<Object> firstListToCompare = new ArrayList<Object>(); 
    firstListToCompare.add("amelia");
    firstListToCompare.add("george");
    firstListToCompare.add("megan");
    final List<Object> secondListToCompare = new ArrayList<Object>();
    secondListToCompare.add("George Wash");
    secondListToCompare.add("Fang");

    treeSet.addAll(firstListToCompare);
    treeSet.addAll(secondListToCompare);
    for (Iterator<Object> iter = treeSet.iterator(); iter.hasNext(); ) {
        System.out.println((String) iter.next());
    }
}

結果...

amelia
Fang
george
George Wash
megan
于 2013-07-26T05:22:04.377 に答える
0

データに変な文字や空白はありますか? ポスターのコードには @Override があり、エラーは発生しません。とは異なりequals()/ hashCode()、デフォルトの Object メソッドは存在しないため、これは発生していません。

これはデータエラーではないかと思います

Comparator メソッドにログまたはブレークポイントを配置し、そこで何が起こっているかを確認します。

public class NamesSorter implements Comparator<EntityBean>{
    @Override
    public int compare (EntityBean a1, EntityBean a2) {
       String name1 = a1.getName();
       String name2 = a2.getName();
       // let's try trimming them..
       name1 = name1.trim();
       name2 = name2.trim();
       int comp = name1. compareToIgnoreCase( name2);
       log.debug("  name CI comparison: "+name1+", "+name2+"="+comp);
       // System.out.println("  name CI comparison: "+name1+", "+name2+"="+comp);
       return comp;
    }
}

ロギングはあなたの友達です。

于 2013-07-26T06:00:37.430 に答える