Java:这里的回报是什么?

时间:2012-08-24 22:41:36

标签: java sorting queue comparator

我在web上创建了此代码。对不起,如果问这里,但我不仅要了解一件事。什么 返回population2 - population1; ? 它通过每次相互比较( o1 o2 )对项目进行排序,方法是在冒号后面加上没有任何空格(引导和决赛)的部分,所以数字,并按......排序?

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 个答案:

答案 0 :(得分: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.

因此,他们使用减法来确定第一个数字是大于,等于还是小于第二个数字,并且该值符合比较合同。即,如果第一个是5,第二个是10,那么10-5 = -5。负返回值表示第一个参数小于第二个参数。

注意当你逆转它时(我假设你的意思是你改为return population1 - population2;而不是你写的东西,这与代码示例相同),你的人口排序也是相反的。

答案 1 :(得分:2)

查看Comparator的{​​{3}}。

简而言之,Comparator compare(T o1,T o2)方法应该在第一个对象大于第二个时返回负Integer,如果它们相等则返回零,如果第二个大于第一个则返回正值。 / p>

所以return population2 - population1;只表示哪个对象更大。

答案 2 :(得分:2)

比较的方法是将一个值与另一个值进行比较。但是,由于比较导致三个可能的答案而不是两个答案,我们需要一种方便的方法让分拣机知道第一个元素是否小于,等于或大于第二个元素。最简单的方法是,如果元素1小于元素2,则返回负数,如果它们相等则返回0,如果第一个元素更大,则返回正数。

我们可以在代码中手动编写

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

但是,分拣机只检查负值和正值,因此结果的大小无关紧要,只要负数表示小于,而正数表示大于。现在,因为我们比较的两个值是数字,并且我们希望按降序对它们进行排序,所以我们可以population1 - popultaion2。如果population1小于population2,则返回负值;如果它们相同则返回0;如果population1大于population2,则返回正值。这简直是​​一种便利。如果你想要相反的效果(按升序排序),只需颠倒语句(如你所示)。

关于sleax的最新评论,Java使用修改后的Merge Sort,它使用从compareTo(..)函数返回的信息。您可以在Wikipedia了解合并排序的工作原理。

答案 3 :(得分:0)

我建议你查看PriorityQueue类的文档。第二个参数是接收带有方法比较的“Comparator”类,如果o1 == 02,则返回0,&lt;如果o1> 0,则为0 o2,&gt; 0如果o1&lt; 02(非常常见的习惯用法)然后在PriorityQueue中将此方法称为表单,作为排序算法的一部分。