0

このコードをWebで作成しました。ここで質問してすみませんが、私が理解していないことは 1 つだけです。正確に人口2 -人口1を返すものは何ですか。? 毎回相互に比較して ( o1o2 )、最終的なスペース (先頭と末尾) なしでコロンの後の部分を取り、数字で並べ替えて、項目を並べ替えます...?

import java.util.Comparator;
import java.util.PriorityQueue;
public class Main {
 public static void main(String[] args) {
  PriorityQueue<String> queue = new PriorityQueue<String>(11,
  new Comparator<String>() {
   public int compare(String o1, String o2) {
   int population1 = Integer.parseInt(o1.split(":")[1].trim());
   int population2 = Integer.parseInt(o2.split(":")[1].trim());
   return population2 - population1;
   }
  });
queue.add("United States: 307006550");
queue.add("Brazil: 193733800");
queue.offer("Russia: 141850000");
queue.offer("India: 1155347700");
queue.offer("China: 1331460000");
System.out.println("Countries in database: " + queue.size());
while (!queue.isEmpty()) {
  System.out.println(queue.poll());
}
System.out.println("Countries in database: " + queue.size());
 }
}

たとえば、コードを次のように変更しようとすると:

return population1 - population2;

番号を次のように並べます。

United States: 307006550
Russia: 141850000
Brazil: 193733800
India: 1155347700
China: 1331460000

なんで?

4

4 に答える 4

2

Comparator.compareのドキュメントによるとCompares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

したがって、減算を使用して、最初の数値が2番目の数値よりも大きいか、等しいか、または小さいかを判断し、値は比較コントラクトに固執します。つまり、最初が5で、2番目が10の場合、10-5=-5です。負の戻り値は、最初の引数が2番目の引数よりも小さいことを示します。

これを逆にすると(return population1 - population2;コードサンプルと同じように、書いたものではなくに変更することを意味していると思います)、母集団の並べ替えも逆になります。

于 2012-08-24T22:47:17.590 に答える
2

のドキュメントを参照してくださいComparator

簡単に言えば、Comparator compare(T o1,T o2)メソッドはInteger、最初のオブジェクトが 2 番目よりも大きい場合は負の値を返し、それらが等しい場合はゼロを返し、2 番目が最初よりも大きい場合は正の値を返す必要があります。

したがってreturn population2 - population1;、どちらのオブジェクトが大きいかを示すだけです。

于 2012-08-24T22:49:11.450 に答える
2

比較が行われる方法は、ある値を別の値と比較することです。ただし、比較の結果、可能な答えは 2 つではなく 3 つになるため、最初の要素が 2 番目の要素より小さいか、等しいか、または大きいかをソーターに知らせる便利な方法が必要です。これを行う最も簡単な方法は、要素 1 が要素 2 より小さい場合は負の数を返し、等しい場合は 0 を返し、最初の要素の方が大きい場合は正の数を返すことです。

これを次のようにコードで手動で書くことができます

if(population1 < population2)
    return -1;
else if(population1 > population2)
    return 1;
return 0;

ただし、ソーターは負の値と正の値のみをチェックするため、負の数がより小さいことを意味し、正の数がより大きいことを意味する限り、結果の大きさは重要ではありません。ここで、比較している 2 つの値は数値であり、それらを降順に並べ替えたいので、単にpopulation1 - popultaion2. これは、人口 1 が人口 2 より小さい場合は負の値を返し、同じ場合は 0 を返し、人口 1 が人口 2 より大きい場合は正の値を返します。それは単に便利です。逆の効果 (昇順での並べ替え) が必要な場合は、ステートメントを逆にするだけです (既に示したように)。

sleax の最新のコメントに関して、Java は関数から返された情報を使用する修正されたMerge SortcompareTo(..)を使用します。Merge Sort がどのように機能するかについてはWikipediaで読むことができます。

于 2012-08-24T22:51:30.500 に答える
0

PriorityQueue クラスのドキュメントを参照することをお勧めします。2 番目の引数は、o1 == 02 の場合は 0、o1 > o2 の場合は < 0、o1 < 02 の場合は > 0 を返すメソッド compare を持つ「コンパレータ」クラスを受け取ります (かなり一般的なイディオム)。このメソッドは、フォーム内で呼び出されます。並べ替えアルゴリズムの一部として PriorityQueue へ。

于 2012-08-24T22:49:11.663 に答える