java - Java 中 Set 和 SortedSet 接口(interface)之间的逻辑不一致

标签 java collections set sortedset

<分区>

我注意到 Java 中的 Set 和 SortedSet 接口(interface)之间存在逻辑上的不一致。

SortedSet 在比较过程中,如果不同的对象(通过 equal() 方法)相同,则将它们识别为相等,但这在逻辑上是不正确的。对象的比较应该只对对象的顺序负责。

例如:我可以有很多产品,我想按价格对它们进行排序。在这种情况下,SortedSet 不能包含具有相同价格的不同产品: [“盐”,0.5$],[“牛奶”,1$],[“面包”,1$],[“香蕉”,2$] 在上面的示例中,牛奶将被面包代替。在这种情况下,继承 Set 接口(interface)的契约将被违反,因为不相等的对象会相互替换。我阅读了 SortedSet 的 JavaDoc,并且知道这种行为有很好的记录,但我认为这是一个合乎逻辑的失败。

你怎么看,也许你已经对 Set 和 SortedSet 有过类似的问题?

最佳答案

这不是逻辑错误,而是设计使然。请注意,如果您的比较算法与 equals 一致,a.compareTo(b) == 0 将等同于 a.equals(b)

javadoc实际上非常明确:

The behavior of a sorted set is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Set interface.

有用吗?

这实际上为您想要实现特定行为提供了灵 active 。例如,假设您想将字符串放入 SortedSet 中并忽略大小写对它们进行排序,您可以使用:

Set<String> set = new TreeSet<> (String.CASE_INSENSITIVE_ORDER);

这将达到预期的结果,但是:

set.add("ABC");
set.add("abc");

只会将一个字符串添加到您的集合中,因为它们将被视为与该特定比较器相等。

关于java - Java 中 Set 和 SortedSet 接口(interface)之间的逻辑不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14534713/

相关文章:

c# - 指向未访问 set 关键字的属性的构造函数

java - 有没有办法使用java注释在spring-integration中编写过滤器?

java - 为什么在 onCreate() 中创建一个新的 Thread 来做 I/O 仍然会出错?

Servlet 中的 java.util.ConcurrentModificationException

java - 使用比较器对对象进行排序给出空指针

string - 提取字符串表达式表示的所有可能的字符串集(汤普森构造的一部分)

c++ - 直接访问STL "set"的元素

java - 将一个数字格式化为另一个数字的格式

java - 无法在请求的时间内获得锁定问题

java - 计算地理点频率