簡體   English   中英

Java:這里的回報是什么?

[英]Java: what the return does here?

我在網絡上創建了此代碼。 如果您在這里問我,請原諒,但我不僅了解一件事。 人口2到底是什么 它通過每次進行比較( 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

為什么?

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. 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.

因此,他們使用減法來確定第一個數字是否大於,等於或小於第二個數字,並且該值堅持比較合同。 即,如果第一個是5,第二個是10,則10-5 = -5。 返回值負表示第一個參數小於第二個參數。

請注意,當您反轉它時(我假設您是要更改為return population1 - population2;而不是您編寫的代碼,這與代碼示例相同),所以人口排序也被反轉了。

查看Comparator 文檔

簡而言之compare(T o1,T o2)當第一個對象大於第二個時, Comparator compare(T o1,T o2)方法應返回負Integer ;如果相等,則返回零;如果第二個對象大於第一個,則返回正值。

因此return population2 - population1; 僅指示哪個對象更大。

比較的方式是將一個值與另一個值進行比較。 但是,由於比較會得出三個可能的答案,而不是兩個,因此我們需要一種方便的方法讓分類器知道第一個元素是否小於,等於或大於第二個元素。 最簡單的方法是說,如果元素一小於元素二,則返回一個負數;如果元素相等,則返回一個0;如果第一個元素較大,則返回一個正數。

我們可以用以下代碼手動編寫

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

但是,排序器僅檢查負值和正值,因此結果的大小無關緊要,只要負數的意思是小於,正數的意思是大於。 現在,由於我們正在比較的兩個值是數字,並且我們想按降序對它們進行排序,因此我們可以只進行population1 - popultaion2 如果人口1小於人口2,則返回負值;如果人口2相同,則返回0;如果人口1大於人口2,則返回正值。 這只是一個方便。 如果要產生相反的效果(按升序排列),只需反轉該語句(如已顯示)。

關於sleax的最新注釋,Java使用了經過修改的合並排序 ,該合並使用了從compareTo(..)函數返回的信息。 您可以在Wikipedia上了解有關合並排序的工作方式。

我建議您在PriorityQueue類上查找文檔。 第二個參數接收一個帶有方法compare的“ Comparator”類,如果o1 == 02,則返回0;如果o1> o2,則返回0;如果o1 <02,則返回> 0(非常常見的成語),然后將該方法稱為form PriorityQueue作為排序算法的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM