比较器中的 CompareTo
CompareTo in Comparators
我有一个关于 compareTo 函数如何在排序方面协助比较器的问题
即 o1.compareTo(o2) 与 o2.compareTo(o1)
如果两个字符串相等,则此方法 returns 0 否则它 returns 正值或负值。如果第一个字符串在字典序上大于第二个字符串,则结果为正,否则结果为负。
上面的语句很简单,但是为什么 o1.compareTo(o2) 会给我一个升序而 o2.compareTo(o1) 给我一个降序?
如果我有整数值 '5,10,3' 我得到 3,5,10 与 o1.compareTo(o2) 和后者相反
String str1 = "Negan";
String str2 = ""; //empty string
//it would return the length of str1 in positive number
str1.compareTo(str2); // 5
//it would return the length of str1 in negative number
str2.compareTo(str1); //-5
按照这个逻辑,使用上面的代码,对于 str1.compareTo(str2) 我应该有一个升序,其中在字法上更大的数字在后面,但是如果 str1 以 "" 出现并且 str2 是 "Negan"。当 1 与 2 进行比较时是否设置了某种规则 -> 意思是如果值为负,则将其置于开头,如果为正,则将其置于末尾?或者,如果 compareTo 是 str2.compareTo(str1),如果值为负,则将其置于末尾,如果为正,则将其置于开头,同时考虑参数的顺序 (str1, str2 ) vs (str2, str1) 其中相应的 compareTo 订单将执行相同的操作,只是 str1.compareTo(str2) = str2.compareTo(str1).
编辑:简单地说,如果参数是可互换的并且以二进制形式执行相同的操作,返回的值如何确定定位。
如果 a < b
,a.compareTo(b)
小于零,您可以读作 "a is before b"。如果 a > b
即 "a is after b".
,则 a.compareTo(b)
大于零
也就是说,对其中一个对象调用 compareTo,将另一个对象作为参数。它的作用是报告'this'对象是否比'argument'对象更less/equal/greater。
请注意 a.compareTo(b)
等于 - b.compareTo(a)
。
现在是比较器。 Comparator.compare(a, b)
应该报告 'a' 和 'b' 的顺序,因此必须(对于升序)调用 a.compareTo(b)
而不是 b.compareTo(a)
—— 因为它是如果 a 在 b 之前,则前者导致正确结果为负,如果 a 在 b 之后,则为正。
因此,如果您编写比较器使得 compare(a, b)
调用 a.compareTo(b)
,您将获得升序;如果它调用 b.compareTo(a)
你会得到降序。
我有一个关于 compareTo 函数如何在排序方面协助比较器的问题 即 o1.compareTo(o2) 与 o2.compareTo(o1)
如果两个字符串相等,则此方法 returns 0 否则它 returns 正值或负值。如果第一个字符串在字典序上大于第二个字符串,则结果为正,否则结果为负。
上面的语句很简单,但是为什么 o1.compareTo(o2) 会给我一个升序而 o2.compareTo(o1) 给我一个降序?
如果我有整数值 '5,10,3' 我得到 3,5,10 与 o1.compareTo(o2) 和后者相反
String str1 = "Negan";
String str2 = ""; //empty string
//it would return the length of str1 in positive number
str1.compareTo(str2); // 5
//it would return the length of str1 in negative number
str2.compareTo(str1); //-5
按照这个逻辑,使用上面的代码,对于 str1.compareTo(str2) 我应该有一个升序,其中在字法上更大的数字在后面,但是如果 str1 以 "" 出现并且 str2 是 "Negan"。当 1 与 2 进行比较时是否设置了某种规则 -> 意思是如果值为负,则将其置于开头,如果为正,则将其置于末尾?或者,如果 compareTo 是 str2.compareTo(str1),如果值为负,则将其置于末尾,如果为正,则将其置于开头,同时考虑参数的顺序 (str1, str2 ) vs (str2, str1) 其中相应的 compareTo 订单将执行相同的操作,只是 str1.compareTo(str2) = str2.compareTo(str1).
编辑:简单地说,如果参数是可互换的并且以二进制形式执行相同的操作,返回的值如何确定定位。
a < b
,a.compareTo(b)
小于零,您可以读作 "a is before b"。如果 a > b
即 "a is after b".
a.compareTo(b)
大于零
也就是说,对其中一个对象调用 compareTo,将另一个对象作为参数。它的作用是报告'this'对象是否比'argument'对象更less/equal/greater。
请注意 a.compareTo(b)
等于 - b.compareTo(a)
。
现在是比较器。 Comparator.compare(a, b)
应该报告 'a' 和 'b' 的顺序,因此必须(对于升序)调用 a.compareTo(b)
而不是 b.compareTo(a)
—— 因为它是如果 a 在 b 之前,则前者导致正确结果为负,如果 a 在 b 之后,则为正。
因此,如果您编写比较器使得 compare(a, b)
调用 a.compareTo(b)
,您将获得升序;如果它调用 b.compareTo(a)
你会得到降序。