【问题标题】:Any data structure in java that supports multiple keys - not map exactlyjava中支持多个键的任何数据结构 - 不完全映射
【发布时间】:2015-08-31 07:53:14
【问题描述】:

我遇到了一种情况,我需要类似的东西:

197 => 6   (1 year)
197 => 12  (2 years)

想要添加多个产品及其价格,根据订阅年限,价值会有所不同。

我想知道我们在 java 中是否有任何支持重复键的数据结构(应该表现得像 map 但必须支持重复键)。

我可以通过创建一个类来做到这一点,但只是想知道是否有任何东西支持这个东西。它更像是一个地图,但没有地图,因为它需要支持多个键。

【问题讨论】:

  • 它如何表现得像一张地图,同时有重复的键?在这种情况下,当您致电 get(197) 时,您期望得到什么?数组?一个列表?当您尝试删除条目时会发生什么:remove(197)...应该删除哪个条目?他们都是?我想你并没有完全想到这一点。
  • 在我看来更像是一个列表而不是地图。或者可能是数组的映射,例如197: [6, 12].

标签: java data-structures hashmap


【解决方案1】:

是的,您可以使用现有的库(如番石榴)来实现。这里是guava库link的接口MultiMap的链接。这里有一个如何使用它的例子(取自here):

  Multimap<String, String> myMultimap = ArrayListMultimap.create();

  // Adding some key/value
  myMultimap.put("Fruits", "Banana");
  myMultimap.put("Fruits", "Apple");
  myMultimap.put("Fruits", "Pear");
  myMultimap.put("Vegetables", "Carrot");

  // Getting the size
  int size = myMultimap.size();
  System.out.println(size);  // 4

  // Getting values
  Collection<string> fruits = myMultimap.get("Fruits");
  System.out.println(fruits); // [Bannana, Apple, Pear]

  Collection<string> vegetables = myMultimap.get("Vegetables");
  System.out.println(vegetables); // [Carrot]

第二种可能性是创建一个Map&lt;String, List&lt;Object&gt;&gt; 并手动处理对您需要关联到单个键的对象列表的引用。

【讨论】:

  • 这就是我所需要的。
  • 如果您发现这是正确的解决方案,您可以用绿旗接受它。谢谢
【解决方案2】:

有 MultiMap 但这看起来不是一个好的用例,您应该使用 Map&lt;Product, Map&lt;Years, Price&gt;&gt;

197 => {
    1 year => 6
    2 years => 12
}

【讨论】:

    【解决方案3】:

    如果你不想使用像番石榴这样的外部库,你可以创建自己的。

    HashMap<Integer, ArrayList<String>> hm = new HashMap();
    for(int i = 0; i < 10; ++i){
     ArrayList<String> li = new ArrayList();
     for(int j = 0; j < 10; ++j)
        li.add(j * i);
     hm.put(i, li);
    }
    System.out.println(hm.get(4));//[0,4,8,12....]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多