问题标签 [comparable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - how can I implement Comparable more than once?
I'm upgrading some code to Java 5 and am clearly not understanding something with Generics. I have other classes which implement Comparable once, which I've been able to implement. But now I've got a class which, due to inheritance, ends up trying to implement Comparable for 2 types. Here's my situation:
I've got the following classes/interfaces:
With this, I get the error 'interface Comparable cannot be implemented more than once with different arguments...'
Why can't I have a compareTo(Foo foo) implemented in FooBar, and also a compareTo(Bar) implemented in BarDescription? Isn't this simply method overloading?
Edit: I have many classes which extend BarDescription. If I remove the type parameter for Comparable on Bar, leaving it in the raw state, then I get a bunch of compiler warnings when sorting all the classes which extend BarDescription. Would this be solved with the wildcards answer below? That answer looks quite complicated and difficult to understand for maintenance.
java - 一致的 Equals() 结果,但不一致的 TreeMap.containsKey() 结果
我有以下对象Node
:
我在下面使用它TreeMap
:
现在,树形图用于一个名为的类中Graph
,用于存储图中当前的节点,以及它们的一组边(来自类Edge
)。我的问题是当我尝试执行时:
我有时会得到以下信息:
哈希码:真等于:真包含: 假N:foo X:foo 比较:0
任何人都知道我做错了什么?我对这一切还是陌生的,所以如果我忽略了一些简单的事情,我提前道歉(我知道hashCode()
这对 来说并不重要TreeMap
,但我想我会包括它)。
edit1:添加了compareTo()
方法信息。
c# - C# .NET:SortedDictionary 的降序比较?
我想要一个IDictionary<float, foo>
首先返回键的大值。
但是,这会按从小到大的顺序返回值。我觉得我在这里犯了一个愚蠢的错误。
为了看看会发生什么,我-
从比较器中删除了符号:
但我得到了同样的结果。这加强了我的直觉,我犯了一个愚蠢的错误。
这是访问字典的代码:
更新:这可行,但是太慢了,无法像我需要调用此方法那样频繁调用:
更新:我在比较器中放置了一个断点,当我从字典中添加和删除 kv 对时,该断点永远不会被击中。这意味着什么?
java - 为什么Java不接受我的泛型LinkedList,而是接受它自己的?
对于课堂作业,我们不能使用任何语言 bultin 类型,所以我只能使用自己的列表。无论如何,情况如下:
然而:
作品。MyTree 实现了 Comparable 接口,但 MyLinkedList 没有。但是,根据this ,Java 的 LinkedList 也没有实现它。那么问题出在哪里,我该如何解决呢?
我的链接列表:
我的树:
java - 关于 null 的 Comparable 和 Comparator 合同
Comparable
合同规定e.compareTo(null)
必须抛出NullPointerException
。
从API:
请注意,
null
它不是任何类的实例,即使返回,也e.compareTo(null)
应该抛出一个。NullPointerException
e.equals(null)
false
另一方面,Comparator
API没有提及比较时需要发生什么null
。考虑以下尝试使用 a 的泛型方法,并为其Comparable
返回 a作为最小元素。Comparator
null
这允许我们执行以下操作:
所以问题是:
- 这是 a 的可接受用法
Comparator
,还是违反了关于比较null
和抛出的不成文规则NullPointerException
的不成文规则? List
甚至必须对包含的元素进行排序是一个好主意null
,还是这是设计错误的明确标志?
java - 为什么 Java 集合框架提供两种不同的排序方式?
如果我有一个想要排序的元素列表,Java 提供了两种方法来解决这个问题。
例如,假设我有一个 Movie 对象列表,我想按标题对它们进行排序。
我可以做到这一点的一种方法是调用静态 java.util.Collections.sort( ) 方法的单参数版本,并将我的电影列表作为单个参数。所以我会调用 Collections.sort(myMovieList)。为了使其工作,Movie 类必须声明为实现 java.lang.Comparable 接口,并且必须在该类中实现所需的方法 compareTo()。
另一种排序方法是调用静态 java.util.Collections.sort() 方法的双参数版本,其中电影列表和 java.util.Comparator 对象作为参数。我会调用 Collections.sort(myMovieList, titleComparator)。在这种情况下,Movie 类不会实现 Comparable 接口。相反,在构建和维护电影列表本身的主类中,我将创建一个实现 java.util.Comparator 接口的内部类,并实现一个必需的方法 compare()。然后我会创建这个类的一个实例并调用 sort() 的两个参数版本。第二种方法的好处是您可以创建无限数量的这些内部类比较器,因此您可以以不同的方式对对象列表进行排序。在上面的例子中,
我的问题是,当 Collections.sort() 的双参数版本完成第一个单参数版本所做的所有事情时,为什么还要费心学习 Java 中的两种排序方式,但还有一个额外的好处是能够对列表的元素进行排序基于几个不同的标准?在编码时必须牢记在心的事情会少一件事。您将了解一种在 Java 中排序列表的基本机制。
java - Java中的直接比较器开箱即用
我有一个方法,它的Comparator
一个参数需要一个。我想传递一个Comparator
进行正常比较的反向比较器和一个反向比较器。
java.util.Collections
提供了一个reverseOrder()
这对反向比较有好处,但我找不到任何正常Comparator
的 .
我想到的唯一解决方案是Collections.reverseOrder(Collections.reverseOrder())
。但我不喜欢它,因为里面调用了双重方法。
当然我可以这样写NormalComparator
:
但我真的很惊讶 Java 没有开箱即用的解决方案。
java - Java HashSet 允许欺骗;有可比性的问题?
我有一个类“Accumulator”,它实现了 Comparable compareTo 方法,我试图将这些对象放入一个 HashSet 中。
当我 add() 到 HashSet 时,我在调试器中的 compareTo 方法中看不到任何活动,无论我在哪里设置断点。此外,当我完成 add()s 时,我在 Set 中看到了几个重复项。
我在这里搞砸了什么;为什么不比较,因此允许欺骗?
谢谢,
IVR 复仇者
java - Java - 使对象集合友好
如果一个对象拥有一个唯一的主键,它需要实现哪些接口才能对集合友好,特别是在高效排序、可散列等方面……?
如果主键是字符串,这些接口如何最好地实现?
谢谢!
java - Java:如何解决缺少 Equatable 接口的问题?
据我所知,诸如SortedMap
or之类的东西在类型上SortedSet
使用compareTo
(而不是equals
)Comparable<?>
来检查相等性(contains
, containsKey
)。
但是,如果某些类型在概念上是相等的,但不可比较怎么办?
(哈希码、内存地址……)
我必须声明一个Comparator<?>
并覆盖方法int compareTo(T o1, To2)
。好的,对于被认为相等的实例,我可以返回 0。但是,对于特殊情况,如果订单不明显,我应该返回什么?
在equatable但(从概念上)不可比较的类型上使用 SortedMap 或 SortedSet 的方法是否很好?
谢谢!
编辑:
我不想存储排序的东西,但我会使用“通常”的 Map 和 Set,我不能“覆盖”平等行为。
编辑 2:
为什么我不能直接覆盖equals(...)
:
我需要改变一个外部类的平等行为。我无法编辑它。
编辑 3:
想想 .NET:他们有 IEquatable 接口,它可以改变相等行为而不触及可比较的行为。
编辑4:
我不能只compareTo
为相等的实例返回0,为不相等的实例返回1吗?有什么大问题?我已经完成了一些测试,似乎 SortedMap/SortedSet 在一对实例上调用了 compareTo 一次。是的,订单没有意义,但为什么会是我的问题呢?我不需要订单。*我只需要改变平等行为。可悲的是,大多数人无法理解这一点。
注意:现在证明不相等实例返回 1 的概念是错误的。
编辑5:改变外国班级
的
平等行为是一个坏概念?当然?我不这么认为:为什么我可以使用 改变外国班级的比较行为?Comparator
编辑 6:
感谢Mark Peters
并感谢waxwing
将密钥类型包装在自定义类中的想法。这样,我可以覆盖 equals 和 hashCode,从而改变相等行为。