2016-06-16 7 views
0

このリストのソート方法と、ソートされたリストの最初の項目を常に最上部の最後の語彙にする理由は簡単です。私は...のcompareToを比較することによって-1 0と1を返しますが、コードは、パラメータがO1とO2が同時に比較されるかもしれないことを示唆しているようだ場合匿名関数Collections.sort Java

List<String> allNames = new ArrayList<>(); 
allNames("Alfred"); 
allNames("Mary"); 
allNames("Hilda"); 
allNames("Zenda"); 
allNames("Thomas"); 
allNames("Isabel"); 



Collections.sort(allNames, new Comparator<String>() { 
@Override 
public int compare(String o1, String o2) { 

if (o1.equals("Zenda") && !o2.equals("Zenda")){ 

return -1; 

} else if (o2.equals("Zenda") && !o1.equals("Zenda")){ 

return 1 ; 
} 

return o1.compareTo(o2); 
} 
}); 

答えて

0

彼らはとても特別な取り扱いに入れていることを取得しますZendaは、常にzendaが第1項または第2項である場合に値をチェックし、-1または1をハードコーディングすることによって常に優先順位が付けられます。その後、残りの順序を通常の文字列compareToの実装に委譲します。

1

Comparator.compareは、Comparable.compareToと同様です。彼らは多かれ少なかれ同じ機能を果たしますが、違いは比較しているオブジェクトです。 compareToは、オブジェクトを他のオブジェクトと比較することを許可しますが、compareは、「サードパーティ」オブジェクトによって2つの他のオブジェクトを比較するために使用されます。

ここで、匿名のComparatorは、2つのStrings、o1およびo2を比較しています。 o1o2の前に来る場合は、-1を返します。それ以外の場合o2o1の前に来る場合は1が返されます。

あなたの匿名の特典は、Comparatorです。"Zenda"が常に最初のものと見なされることが保証されています。

+0

これは、o1とo2が同じオブジェクトである可能性があることを意味しますか?コードは、同じ条件付きIf文で2つの引数で等号を探しているようです。 – DevelopeXCode

+0

確かにそうかもしれません。 'o1'が" Zenda "で、" o2 "が" Zenda "でない場合の第1の条件チェックと、第2の条件式では反対のチェックを行います。たとえば、両方が「Zenda」の場合、「else」条件が発生します。 'o1.compareTo(o2)'は、同じオブジェクトであれば '0'を返します。これは、ソート方法に、2つのオブジェクトの相対的な順序は関係ない(それらが同じであるため)ことを知らせます。 – Zircon

+0

私は実装を視覚化できるように、使用しているアルゴリズムを知っている人はいません。説明が簡単な場合は、シーンの裏に何が起こっているのですか... – DevelopeXCode