重复的键值对

4

在Java中,是否有一种原生数据结构可以接受键值对并允许重复?我正在创建一个字符串中字符的清单,但某些字符出现了多次。

例如:

j -> false
a -> false
v -> false
a -> false

不确定键/值对,但你看过“Bag”吗?它们允许重复,并且可能有一些可用的东西。 - Trenin
许多答案建议使用Guava的multimap,但我想使用标准的Java库。 - Liondancer
1
列表和对,这就是我说的 ;) - bobbel
1
如果你想要标准的Java,你需要额外做一些工作来模拟“multimap”的行为,就像在回答你的问题中建议的那样。 - PNS
这个答案中提到了标准Java类,参考链接为:https://dev59.com/PXNA5IYBdhLWcg3wL6oc#6352551。 - Bernhard Barker
这是另一个可能的重复问题 - 具有相同键下多个值的HashMap - Bernhard Barker
5个回答

5
您可以通过将每个KV对的值保存在Map中的列表中来模拟多个键值对。这是"多值"映射的标准实现方法。
因此,如果键是一个Character对象,而值是Boolean,您可以执行:
Map<Character, List<Boolean>> multimap = new HashMap<Character, List<Boolean>>();

每当您想向地图中的现有KV对添加新值时,只需调用

multimap.get(key).add(value);

其中 key 代表字符,value 代表对应的 Boolean 值。

GoogleGuava 库(免费下载)实现了多种方式的 Multimap 接口,因此您可以实例化一个 MultiMap<Character, Boolean> 映射并相应地使用它。同样,您可以获取 Apache Commons Collections 库并使用其 MultiValueMap 类。您还可以查看类似于 此StackOverflow问题的答案或者 其他问题

如果您只想为每个键存储一个值,则应该在 List 的位置使用 Set


如果我理解正确,你建议的是像这样的东西。 J, [F] | A [F,F] | V [F] - Liondancer
是的,这也许就是它最终会被实现的方式。 - PNS
我觉得在查找方面,你的解决方案性能比Bobbel的更好,但他的似乎更容易编写。 - Liondancer
我建议的方法是标准做法,你可以根据需要使用 Map 接口的哪些函数轻松创建自己的 MultiMap 类。它保持了 KV “映射”行为,不会复制键。 - PNS

4
使用ListPair列表:
public class Pair<T, U> {
    public final T key;
    public final U value;

    public Pair(T key, U value) {
        this.key = key;
        this.value = value;
    }
}

public class YourApp {
    public static void main(String[] args) {
        List<Pair<Character, Boolean>> charList = new ArrayList<Pair<Character, Boolean>>();
        charList.add(new Pair('j', false));
        charList.add(new Pair('a', false));
        charList.add(new Pair('v', false));
        charList.add(new Pair('a', false));

        for (Pair<Character, Boolean> pair : charList) {
            System.out.println(pair.key + " -> " + pair.value);
        }
    }
}

使用自编的通用 Pair 类,您可以持有任何类型的键和值。如果您将对成对添加到 List 中,则可以保留重复的对条目。

3
您可以使用MultiMap<Character,Boolean>,因为它允许重复的键存在于org.apache.commons.collections包中。
或者您可以使用ArrayList,并添加包含字符和布尔值对属性的Class对象。

只是提一下:这是Apache Commons,不是标准的Java。 - bobbel
1
是的,我知道。谁说这个类是用Java写的? - Kick
2
相反,你没有说这不是一个标准的Java类 ;) - bobbel
1
这是 Java 外部库中著名的类。 - Kick

2

我不知道有内置的解决方案。

一个快速的替代方案是使用简单的ArrayList,并创建一个对象,该对象是char / boolean对,您可以将其添加到其中。


1

commons.apache.org有MultiHashMap类。尝试使用它...!!!

MultiHashMap mp = new MultiHashMap();
mp.put("a", "1");
mp.put("b", "4");
mp.put("c", "2");
mp.put("a", "6");
List list = null;
Set set = mp.entrySet();
Iterator i = set.iterator();
while (i.hasNext()) {
        Map.Entry<String, List<String>> me = (Map.Entry) i.next();
        for(int j = 0 ; j< me.getValue().size(); j++ ){
        System.out.println(me.getKey() +" : " +me.getValue().get(j));
        }
    }
}

1
这已被弃用。如果使用Apache commons Collections,则应使用MultiValueMap类。 - PNS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接