- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直试图弄清楚 CompareTo()
方法在内部是如何工作的,但我失败了。我搜索了这个站点并阅读了一些帖子,我想我已经在 MSDN 中看到了关于这个主题的所有内容,但我似乎不明白。 MSDN 示例:
public int CompareTo(object obj)
{
if (obj == null)
{
return 1;
}
Temperature otherTemperature = obj as Temperature;
if (otherTemperature != null)
{
return this.temperatureC.CompareTo(otherTemperature.temperatureC);
}
else
{
throw new ArgumentException("the object is not a temperature");
}
}
这是 CompareTo()
方法实现的 MSDN 示例。我明白这一点,我明白 IComparable
接口(interface)是如何工作的,如果我理解正确的话,当我使用 ArrayList.Sort()
方法时会调用它。
我不明白的是:程序什么时候传递CompareTo(object obj)
方法的参数?或者换句话说,Sort()
方法是如何工作的?我的意思是,这段代码将一个温度实例与另一个温度实例进行比较,但是程序何时或如何获取第二个温度实例以进行比较?我希望我的问题是有道理的。
我已经尝试将 CompareTo()
过程打印到屏幕上,所以也许我可以对输出进行逆向工程,但我更加困惑了。
编辑:也许如果我一步一步来,我可以更好地解释自己。假设我有 3 个温度对象:ArrayList
中的 34、45、21。当我调用 ArrayList.Sort()
时,CompareTo()
方法的调用方式是否类似于 34.CompareTo(45)
?然后 45.CompareTo(21)
?返回的整数在第一次比较中为 1,在第二次比较中为 -1?如果我仅将 CompareTo()
方法定义为仅当 obj(参数)为 null 时才返回 1,那么这些整数是如何返回的?我没有定义任何返回 -1 或 0 的东西。就好像我正在实现一个已经实现的方法。在已定义返回 -1、0 和 1 的情况下定义 CompareTo()
方法。
最佳答案
让我们从基本概念开始。
What is 42 to 1337. Is 42... greater than, less than or equal to 1337?
此问题及其答案由 CompareTo
建模IComparable<T>
中的方法和 IComparable
接口(interface)。对于 A.CompareTo(B)
,该方法可以返回:
当然,IComparable
不限于整数。您可以实现 IComparable
比较您认为应该比较的任何两个对象。例如,字符串:
What is "Armadillo" to "Zodiac": Is "Armadillo"... greater than, less than or equal to "Zodiac"?
答案取决于您对大于、小于和等于的定义。对于字符串,通常的顺序是字典中较晚出现的词大于较早出现的词。
好的,现在您知道如何比较任意两个对象了。这对许多算法都很有用,但主要是排序算法。以一个非常简单的排序算法为例:stupid sort。想法是:
Look at two adjacent elements in your array, A and B.
When A <= B: go forward to the next pair.
When A > B: swap A and B, and go back to the previous pair.
When we reach the end, we're done.
您知道,要进行排序,必须有一种方法来确定两个元素中哪个更大。那就是IComparable<T>
开始发挥作用。
public static void StupidSort<T>(T[] array)
where T : IComparable<T>
{
int index = 0;
while (index < array.Length)
{
if (index == 0 ||
array[index - 1].CompareTo(array[index]) <= 0)
{
index++;
}
else
{
Swap(array, index - 1, index);
index--;
}
}
}
你当然可以编程CompareTo
返回任何你想要的。但如果你搞砸了,那么你的方法将不再回答什么是 this
的问题。至 obj
? 总是返回 1 意味着对于任何 A 和 B,A 总是大于 B。这就像说:20 大于 10 并且 10 大于 20。它确实没有意义,结果是你做的任何排序也没有任何意义。垃圾进...垃圾出。
游戏规则是,对于给定的三个对象 A、B 和 C:
A.CompareTo(A)
必须返回 0(A 等于 A)。A.CompareTo(B)
返回 0,然后 B.CompareTo(A)
返回 0(如果 A 等于 B,则 B 等于 A)。A.CompareTo(B)
返回 0,并且 B.CompareTo(C)
返回 0,然后 A.CompareTo(C)
返回 0(如果 A 等于 B,并且 B 等于 C,则 A 等于 C)。A.CompareTo(B)
返回大于 0 的值,然后 B.CompareTo(A)
返回小于 0 的值(如果 A 大于 B,则 B 小于 A)。A.CompareTo(B)
返回小于 0 的值,然后 B.CompareTo(A)
返回大于 0 的值(如果 A 小于 B,则 B 大于 A)。A.CompareTo(B)
返回大于 0 的值,并且 B.CompareTo(C)
返回大于 0 的值,然后 A.CompareTo(C)
返回大于 0 的值(如果 A 大于 B,并且 B 大于 C,则 A 大于 C)。A.CompareTo(B)
返回小于 0 的值,并且 B.CompareTo(C)
返回小于 0 的值,然后 A.CompareTo(C)
返回小于 0 的值(如果 A 小于 B,并且 B 小于 C,则 A 小于 C)。null
总是小于任何非空对象。如果您的实现不遵守这些(简单且合乎逻辑的)原则,那么排序算法实际上可以做任何事情,并且可能不会给出您期望的结果。
关于c# - Sort() 和 CompareTo() 方法的内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233246/
这似乎很奇怪,这并没有像我预期的那样工作。我编写了一个简单的java类,它实现Comparable接口(interface)并重写compareTo()方法。但是,它不允许我传递除对象之外的特定类型的
public int compareTo(Object another) throws CustomMadeException { if(this.getClass() != another.
早些时候,我在通用 IComparable 中获得了逆变的具体示例Jon Skeet 的界面。然而,这又产生了另一个问题。为什么不是通用的 List.Sort()方法能够推断出相同的信息? 我在这里提
我有注释 package javaannotationtest; import java.lang.annotation.*; @Target({ElementType.METHOD}) @Reten
我试图理解 C# 中的 CompareTo(),下面的示例让我比以往任何时候都更加困惑。有人能帮我理解为什么第三个变体的结果是 1 吗?句子“Hello wordd”中的第二个词与 str1“Hell
我已经在这个程序上工作了几天,并且在我的 BinarySearchTree 类中实现了一些主要方法,例如插入和删除。插入似乎工作正常,但是一旦我尝试删除,我就会不断出错。因此,在玩弄了代码之后,我想测
首先,我必须提到的是,在阅读了大量问题和教程并观看了一些视频后,问题仍然没有解决。 我是一名Java中级程序员,我编写了一些用于比较优先级队列中的元素的代码,其中元素的保存方式类似于[Comparab
我只是在为即将到来的考试做一些复习。我发现了我们的讲师给我们提供的这段代码供我们修改。 代码: public class Employee implements Comparable{ private
我的书要求我为一段代码编写 Javadoc 注释。大多数情况下,我了解如何执行 javadocs,但我不了解该程序在做什么。 “为类 Person 的以下方法编写 Javadoc 注释。假设类 Per
如果我写以下内容是否有可能溢出: public class SomeObj implements Comparable { private final float data; pub
我有一个名为任务的类,我想将其放入 PriorityQueue 中。 我的类(class)通过日期和名为isUrgent的 boolean 字段进行比较 @Override publ
这个问题已经有答案了: Java error: Comparison method violates its general contract (13 个回答) 已关闭 7 年前。 我有这个compa
我的类(class)结构: public class Priorityy implement Comparable { public int compareTo(Object pe) {
给定一个非负整数列表,我想对它们进行排列,使它们形成最大的数字。给定 [1, 20, 23, 4, 8],最大的形成数字是 8423201。但我想弄清楚compareTo 方法中变量的顺序如何影响 A
我想通过上次联系日期比较两个“收件人”,如果相同,则通过地址进行比较。这是我的代码: public class RecipientComparator implements Comparator {
package Comparable; public class Movie implements Comparable { private double rating; privat
您好,我在实现compareTo 方法时遇到问题。我一直在寻找答案,但没有任何帮助。我正在尝试用各种大小的圆圈填充 TreeSet。我需要在我的圈子类中使用compareTo 才能以这种方式存储它们。
我有以下代码;目的是返回数组中按字母顺序排列的最小成员。 public String smallest() { String smallest = ""; int i = 0; while(log[i
我有一个关于compareTo函数如何协助比较器进行排序的问题即 o1.compareTo(o2) 与 o2.compareTo(o1) 如果两个字符串相等,则此方法返回 0,否则返回正值或负值。如果
帮助我无法弄清楚compareTo函数。这就是我必须做的:编写一个compareTo函数,可用于根据以下内容按顺序放置产品到他们的零件号。也就是说,后面按字母顺序排列的零件号顺序大于按字母顺序排列较早
我是一名优秀的程序员,十分优秀!