TreeMap表现异常

Nee*_*eel 5 java

import java.util.*;    
public class Test {
        public static void main(String[] args) {

            Map<String,String> map = new TreeMap<String,String>();
            map.put("10", "America");
            map.put("1", "Australia");
            map.put("2", "India");
            map.put("11", "China");

            System.out.println(map);

        }
    }
Run Code Online (Sandbox Code Playgroud)

运行上面的代码片段时,在控制台中我得到的输出为:

{1=Australia, 10=America, 11=China, 2=India}

但我期待输出为

{1=Australia, 2=India, 10=America, 11=China}

但是当改变上面main()里面提到的逻辑时

 Map<String,String> map = new TreeMap<String,String>();
        map.put("US", "America");
        map.put("AUS", "Australia");
        map.put("IN", "India");
        map.put("CH", "China");

    System.out.println(map);
Run Code Online (Sandbox Code Playgroud)

我得到了理想的输出

({AUS=Australia, CH=China, IN=India, US=America})

根据我的理解,TreeMap的entrySet()方法返回映射中包含的映射的set视图.set的迭代器以升序键顺序返回映射.那么为什么会出现这种情况呢?

任何建议都非常感谢.

Mat*_*all 16

因为"10"字典上小于"2".


这是一个提示:

Map<Integer,String> map = new TreeMap<Integer,String>();
map.put(10, "America");
map.put(1, "Australia");
map.put(2, "India");
map.put(11, "China");

System.out.println(map);
// {1=Australia, 2=India, 10=America, 11=China}
Run Code Online (Sandbox Code Playgroud)

这是另一个提示:String#compareTo(String)vs Integer#compareTo(Integer).


你能解释一下你的意思是什么?"'10'的词典尺寸小于'2'".

首先,阅读我链接的JavaDoc,尤其是第一个链接.

现在让我们回顾一些简单的字符串比较:

  • "a"显然出现在"b"之前
  • 同样"b"出现在"z"之前

将它扩展为数字字符应该不会有太大的影响:

  • "0"出现在"1"之前
  • "1"出现在"9"之前

单个字符,如排序a,b,z,0,1,和9被称为他们的字典顺序.简而言之,每个角色都有一个数字表示,你不会觉得非常令人惊讶.

现在让我们看一些稍微复杂的字符串比较:

  • "aa"出现在"bb"之前(这不应该是一个惊喜)
  • "aa"也出现在"ab"之前

我们如何确定第二个案例?性格特征.

1. "a" is the same character as "a", so we need to keep going
2. "a" comes before "b", so we're done.
Run Code Online (Sandbox Code Playgroud)

还有一个例子:"ba"出现在"c"之前,因为"b"出现在"c"之前.

让我们对包含数字字符的字符串做同样的事情:

  • "2"是否在"10"之前出现?我们逐个字符地比较:

    1. "2"是否在"1"之前?不,它来了,所以我们已经完成了.

  • "10"小于"2",正如"BA"小于"C".在您的情况下,"10"中的"1"小于"2". (2认同)