【问题标题】:Java TreeMap not good enoughJava TreeMap 不够好
【发布时间】:2015-03-10 22:14:09
【问题描述】:

我想要一个可以整理出来的Map<Integer, String>。我尝试使用TreeMap<Integer, String>,但它每个元素只存储一个键,我希望有多个相同的键元素。
例如,当我添加:

map.put(1, "Daniel");
map.put(3, "Monica");
map.put(4, "Pinto");
map.put(3, "Lucia");

然后打印所有元素,TreeMap 显示为:

1 丹尼尔
3 露西亚
4平托

我希望它打印出来:

1 丹尼尔
3 莫妮卡
3 露西亚
4平托

我应该为此使用什么数据类型?

【问题讨论】:

  • 没有类足够好,Java 也不够好 :)) 考虑Map<Integer, Set<String>>,或者排序的多映射(实际上相当于集合的映射);)
  • 听起来你想要一个TreeMultimap
  • @AlexShesterov 为什么我需要在最后一个参数中使用Set<String>
  • @dan_san_1 根据定义,每个键只能存储一个值。但该值可以是更多值的集合..
  • 好的,我了解@immibis。谢谢!

标签: java sortedmap


【解决方案1】:

映射中的键是唯一的,因此每个键只能关联一个值。这就是为什么您的键“3”在输出中只出现一次。

似乎有两种解决方案,具体取决于您的要求:

  • 使用SortedSet,使用IntegerString 的元素化合物以及自定义Comparator。这样,“3 Monica”和“3 Lucia”将形成您收藏中完全独立的元素。它将与您的输出相匹配,因为集合中的每个元素将是您问题中显示的输出中的一行,但感觉有点笨拙,很可能不是您想要的。
  • 为地图中的值使用集合类,例如一个List<String>,所以你会有一个Map<Integer,List<String>>。然后,您不能使用put 方法添加到该列表,但您需要创建自己的方法来延迟检索或创建List,并附加新元素。该集合将看起来像这样:

    1,[丹尼尔]
    3、【莫妮卡露西亚】
    4、【平托】

因此不会完全符合您的要求,但更有可能是您想要的。

【讨论】:

    【解决方案2】:

    使用 MultiMap - 一个包含针对每个键的值集合的映射。

    MultiMap mhm = new MultiHashMap();
    mhm.put(key, "A");
    mhm.put(key, "B");
    mhm.put(key, "C");
    Collection coll = (Collection) mhm.get(key);
    

    coll 将是一个包含“A”、“B”、“C”的集合。

    【讨论】:

    • 在哪里可以下载多地图 jar?
    • 它的 guava-17.0.jar。 maven 依赖是 com.google.guavaguava17.0
    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多