thi*_*ker 4 java collections set sortedset
我注意到Java中的Set和SortedSet接口之间存在逻辑不一致.
如果在比较期间它们是相同的,则SortedSet将不同的对象(通过equal()方法)识别为equals,但它在逻辑上是不正确的.对象的比较应仅对对象的顺序负责.
例如:我可以有很多产品,我想按价格对它们进行排序.在这种情况下,SortedSet不能包含具有相同价格的不同产品:["salt",0.5 $],["milk",1 $],["bread",1 $],["bananas",2 $在上面的例子中,牛奶将被面包取代.在这种情况下,将违反继承的Set接口的合同,因为不相等的对象会相互替换.我是Reded JavaDoc的SortedSet,并且知道这个行为有很好的记录,但我认为这是一个逻辑上的失败.
你有什么看法,也许你已经和Set和SortedSet有类似的问题了?
这不是一个逻辑上的失败,而是一个设计属性.请注意,如果您的比较算法与equals一致,a.compareTo(b) == 0则相当于a.equals(b).
该javadoc的其实是它非常明确的:
即使排序与equals不一致,排序集的行为也是明确定义的; 它只是不遵守Set接口的一般合同.
这有用吗?
这实际上为您希望达到特定行为提供了灵活性.比方说,例如,您希望将字符串放入SortedSet并将它们排序,忽略大小写,您可以使用:
Set<String> set = new TreeSet<> (String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)
这将达到预期的效果,但是:
set.add("ABC");
set.add("abc");
Run Code Online (Sandbox Code Playgroud)
只会在您的集合中添加一个字符串,因为它们将被视为与该特定比较器相等.
| 归档时间: |
|
| 查看次数: |
1475 次 |
| 最近记录: |