字符串的树集对我来说是不合逻辑的行为

时间:2015-09-22 18:53:29

标签: java tree set

我有这段代码:

 public static void main(String[] args)
{
    NavigableSet<String> myset = new TreeSet<String>();
    myset.add("a");
    myset.add("aa");
    myset.add("b");
    myset.add("bb");
    myset.add("c");
    myset.add("cc");

    System.out.println(myset.ceiling("a"));
    System.out.println(myset.floor("aaa"));
    System.out.println(myset.higher("a"));
    System.out.println(myset.lower("bb"));
}

我认为它会打印出来:a,b,null,c。因为例如higher("a")应该提供null,因为a是此树的根,但它提供aahigher的定义是Returns the least element in this set strictly greater than the given element, or null if there is no such element.因此,严格意义上的更大意味着大于a,但由于a是三者的根,所以没有什么比它更重要。 aa按字母顺序排在a之后。

实际上它会返回我想要的确切对位。这是为什么。这对我来说似乎很不合逻辑。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

  

因为例如更高(“a”)应该给出null,因为a是这棵树的根,但是它给出了aa。

哪个元素是树的根并不重要,但是如果树是平衡的并且它应该是中间值,例如'“bb”'应该是根。

“aa”是“a”之后的第一个,因为String以相同的字符开头,但它更长,所以这是预期的结果。

  

因为a是三者的根,所以没有什么比它更重要了。

"a"最小的,所以没有比它更小。

  

它返回我想要的确切对位。

在数字中,我们从0,1,2,3等开始从左到右依次增加。

在字母表中我们说a,b,c,d从左到右增加。即a <&lt; b&amp;&amp; a&lt; ç

令人困惑的是比较是ASCIIbetical换句话说,字母的ASCII码的顺序很重要。 (更具体地说,编码为UTF-16时使用的代码)这意味着'0'&lt; '9'和'9'&lt; 'A'和'A'&lt; 'Z'但是'Z'&lt; 'a'和'a'&lt; 'Z'

enter image description here