我正在尝试创建一个方法,该方法将第一个Map的值设置为第二个,而第二个空Map的值为Lists,并使用与第一个相同的键/值映射填充第二个Map。第二个映射将包含第一个映射中的每个键,但与之关联的是它映射到的Set中所有相同元素的List。在第二个映射中使用ArrayList。这是我得到的方法。
public static<K,E> void values(Map<K, Set<E>> ml, Map<K, List<E>> m2){
for (Map.Entry<K, Set<E>> e; e < ml.size(); ? // I am not sure what to write here: a e.hasNext() or a e.next)
// then i have to use a put method right?
m2.put(e.getKey(), new ArrayList<E>(? )) // I don't know how to get the value, would it just be the same as e.getKey() or e.value
}
你能告诉我你会怎么做吗?或者如果有什么不对的? 谢谢你的帮助
答案 0 :(得分:1)
不是100%完全是你的意思,但是这个怎么样:
public static<K,E> void values(Map<K, Set<E>> m1, Map<K, List<E>> m2)
{
for(K key : m1.keySet())
{
Set<E> source = m1.get(key);
List<E> dest = m2.get(key);
if(dest == null)
{
dest = new ArrayList<E>();
m2.put(key, dest);
}
dest.addAll(source);
}
}
答案 1 :(得分:1)
2个选项:
public static <K, E> void values(Map<K, Set<E>> m1, final Map<K, List<E>> m2) {
if (m1 == null)
throw new IllegalArgumentException("null map 1");
if (m2 == null)
throw new IllegalArgumentException("null map 2");
for (Map.Entry<K, Set<E>> e : m1.entrySet()) {
m2.put(e.getKey(), new ArrayList<E>(e.getValue()));
}
}
public static <K, E> Map<K, List<E>> values(Map<K, Set<E>> m) {
if (m == null)
throw new IllegalArgumentException("null map");
Map<K, List<E>> m2 = new HashMap<K, List<E>>(Math.max(
(int) (m.size() / 0.75f) + 1, 16), 0.75f);
for (Map.Entry<K, Set<E>> e : m.entrySet()) {
m2.put(e.getKey(), new ArrayList<E>(e.getValue()));
}
return m2;
}
答案 2 :(得分:0)
我发现while循环比循环更适合迭代,但也许只是我:)
public static<K,E> void values(Map<K, Set<E>> m1, Map<K, List<E>> m2) {
Iterator<K> iter = m1.keySet().iterator();
while (iter.hasNext()) {
K key = iter.next();
Set<E> value = m1.get(key);
m2.put(key, new ArrayList<E>(value));
}
}
答案 3 :(得分:0)
如果可以,我强烈建议您使用MultiMap。 Google有一个很棒的界面Multimap
。有两个子接口:
SetMultimap<K, V>
,相当于Map<K, Set<V>>
ListMultimap<K, V>
,相当于Map<K, List<V>>
接口抽象出很多数组/列表的复杂性,所需的方法如下:
public static <K, E> void values(Multimap<K, E> m1, Multimap<K, E> m2) {
m2.putAll(m1);
}
(不用说,首先你不需要额外的方法)。
界面允许简单的插入模式
Multimap<String, String> map1 = HashMultimap.create();
map1.put("a", "first");
map1.put("a", "second");
map1.put("b", "third");
map1.get("a"); // --> returns ["first", "second"]
map1.get("b"); // --> returns ["third"]
map1.get("c"); // --> returns [], empty set =)