【问题标题】:TreeMap behaves abnormallyTreeMap 行为异常
【发布时间】:2011-09-10 23:17:46
【问题描述】:
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);

        }
    }

当运行上面的代码 sn-p 时,在控制台中我得到的输出是:

{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);

我得到了想要的输出

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

据我了解,TreeMap 的 entrySet() 方法返回地图中包含的映射的集合视图。该集合的迭代器以升序键顺序返回映射。那么为什么在第一种情况下会发生这种情况呢?

非常感谢任何建议。

【问题讨论】:

  • 标题太棒了。几乎和以下一样有用:'treemap not works'
  • 对不起,没有什么比这更严重的了

标签: java


【解决方案1】:

因为"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}

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


您能否解释一下“'10' 在字典上小于 '2'”究竟是什么意思。

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

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

  • “a”显然在“b”之前
  • 同样,“b”在“z”之前

将其扩展到数字字符应该不会太费力:

  • “0”在“1”之前
  • “1”在“9”之前

单个字符的顺序,例如abz019,称为它们的lexicographical order。简而言之,每个字符都有一个数字表示,您不会觉得非常惊讶。

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

  • “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.

还有一个例子:“ba”在“c”之前,因为“b”在“c”之前。

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

  • “2”在“10”之前吗?我们逐个字符比较:

    1. “2”是否在“1”之前?不,它在后面,所以我们已经完成了。

【讨论】:

  • 您能否解释一下“'10' 在字典上小于 '2'”究竟是什么意思。
  • 在我输入内容时阅读链接的 JavaDocs。
  • "10" 小于 "2",正如 "BA" 小于 "C"。在您的情况下,“10”中的“1”小于“2”。
  • 嗨,马特,这不是我所期待的答案。我知道实际上基本事实是 String 的 compareTo 方法按字典顺序比较字符串,因为我无法理解按字典顺序的含义我上传了这个问题。
  • 查看我的编辑。这有点啰嗦,但希望它很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2017-01-22
  • 2013-04-14
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多