2011-10-07 52 views
0

Java文档TreeSet包含神秘的断言:“一个TreeSet的行为是明确的,即使它的排序是严格部分,只不过没有遵守Set接口的常规协定。 “我想知道当Comparable.compareTo()被定义为任何一对元素时,如何提供部分有序的元素,因此暗示总和关系(如果总关系是自反的,反对称的和传递的,那么它是总的顺序)。TreeSet的

+2

没有提及partial http://download.oracle.com/javase/6/docs/api/java/util/TreeSet.html –

+1

看来引用来自旧版本的Java,如v1.2左右:http://www.google.com/search?q="well-defined+even+if+its+ordering+is+strictly+partial“ – Nayuki

回答

-2

我没有找到有关JavaDoc的“部分” 5

红黑树作品,TreeSet实现:在没有与“部分”的任何信息。

您确定您正在阅读java.util.TreeSet

+1

它显示为:“集合的行为定义良好,即使它的排序是**不一致**与等于;它只是不服从Set接口的总体合同。' – jefflunt

+0

我不认为Google搜索“TreeSet”和阅读描述可以让我陷入这种麻烦。获得的经验:注意版本。 –

-2

它是否是“全部订单”取决于.compareTo()的实施情况。我们假设你将一个列表Integers排序为一棵树,但不是用精确的数值比较它们,而是想把所有的数字都分成100块。所以,你会认为数字0-99彼此相等,100-199彼此相等,200-299彼此相等。您可以通过将Integer值加100,然后比较THAT结果来做到这一点。因此,所有数字0-99都小于全部数字100-199,但是5 == 43172 == 121.compareTo()方法而言,因为在比较之前所有值都除以100。

因为在这个例子中5 == 43那么5可能会在43之前,或43之前43,因此它们是部分排序的,但TreeSet的行为保持不变,因为它使用.compareTo()来构建树。

您可以使用偏序排序将基本上分组的东西组合成更大的块,即使总的自然排序不是由排序产生的。

+1

对于部分比较,您需要四值退货:”<","=",">“ ,和“未定义” –