java:返回在这里做什么?

pn9klfpd  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(386)

我在网上建立了这个代码。如果有人问我,请原谅,但我不明白一件事。究竟是什么返回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

为什么?

vbkedwbf

vbkedwbf1#

查看文档 Comparator .
一言以蔽之
Comparator compare(T o1,T o2) 方法应返回负数 Integer 当第一个对象大于第二个对象时,如果它们相等则为零,如果第二个对象大于第一个对象则为正值。
所以呢 return population2 - population1; 只是指示哪个物体更大。

9rbhqvlz

9rbhqvlz2#

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. 因此,他们使用减法来确定第一个数字是大于、等于还是小于第二个数字,并且值与比较契约一致。i、 如果第一个是5,第二个是10,那么10-5=-5。负返回值表示第一个参数小于第二个参数。
注意,当你反转它时(我假设你的意思是你正在改变为 return population1 - population2; 与您编写的(与代码示例相同)不同,您的总体排序也会反转。

eblbsuwk

eblbsuwk3#

我建议您查阅priorityqueue类的文档。第二个参数是接收一个“comparator”类,该类带有一个compare方法,如果o1==02,则返回0;如果o1>o2,则返回<0;如果o1<02,则返回>0(非常常见的习惯用法)。然后在priorityqueue中将此方法称为form,作为排序算法的一部分。

7gcisfzg

7gcisfzg4#

比较的方法是将一个值与另一个值进行比较。然而,由于比较会得到三个可能的答案,而不是两个,因此我们需要一种方便的方法让分类人员知道第一个元素是小于、等于还是大于第二个元素。最简单的方法是,如果元素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使用了一个修改的合并排序,该排序使用从 compareTo(..) 功能。你可以在维基百科上读到关于合并排序的工作原理。

相关问题