【问题标题】:Java: what the return does here?Java:return 在这里做什么?
【发布时间】:2012-08-24 22:41:36
【问题描述】:

我在 web 上创建了此代码。打扰一下,如果在这里问,但我不只明白一件事。 返回 population2 - population1; 究竟是什么? 它通过每次相互比较 (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

为什么?

【问题讨论】:

  • kurtzbot:对不起,现在我已经修改了我最后的问题。
  • 对于所有人:我知道 compare(arg1,arg2) 或 arg1.compareTo(arg2) 如果 arg1arg2 为正数,否则返回 0。但我会说出这一切背后的算法是什么。也就是说,在我插入第一个之后它什么也不做。但是从第二个开始,它到底做了哪些操作呢?我希望我的问题很清楚。
  • 我在看到最新评论后更新了答案。

标签: java sorting queue comparator


【解决方案1】:

进行比较的方法是将一个值与另一个值进行比较。但是,因为比较结果是三个可能的答案而不是两个,所以我们需要一种方便的方法让排序器知道第一个元素是小于、等于还是大于第二个元素。最简单的方法是,如果元素一小于元素二,则返回负数,如果相等则返回 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 了解合并排序的工作原理。

【讨论】:

    【解决方案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; 而不是您编写的,与代码示例相同),您的总体排序也反转了。

    【讨论】:

      【解决方案3】:

      查看documentation 中的Comparator

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

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

      【讨论】:

        【解决方案4】:

        我建议您查看有关 PriorityQueue 类的文档。第二个参数是接收一个“比较器”类,它的方法 compare 将在 o1 == 02 时返回 0,如果 o1 > o2 则返回 0(非常常见的成语)然后在内部调用该方法PriorityQueue 作为排序算法的一部分。

        【讨论】:

        • 不好意思问了个问题!如果版主可以删除帖子,请删除!
        • 我认为有些人不赞成它,因为他们没有看到您在研究 Comparator 所做的工作方面付出的努力,因为这是一个有据可查的工具。我不知道否决票是否公平,但我相信这是他们的理由。
        猜你喜欢
        • 1970-01-01
        • 2011-01-28
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多