Java设置从映射到集合的值
我正在尝试创建一个方法,该方法获取值为set的第一个映射和值为list的第二个空映射,并使用与第一个映射相同的键/值映射填充第二个映射。第二个映射将具有第一个映射中的每个键,但与之相关联的是它映射到的集合中的所有相同元素的列表。使用第二个映射中的ArrayList。这是我得到的方法Java设置从映射到集合的值,java,map,arraylist,set,Java,Map,Arraylist,Set,我正在尝试创建一个方法,该方法获取值为set的第一个映射和值为list的第二个空映射,并使用与第一个映射相同的键/值映射填充第二个映射。第二个映射将具有第一个映射中的每个键,但与之相关联的是它映射到的集合中的所有相同元素的列表。使用第二个映射中的ArrayList。这是我得到的方法 public static<K,E> void values(Map<K, Set<E>> ml, Map<K, List<E>> m2){ for (
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
}
publicstaticvoid值(Map ml,Map m2){
for(Map.Entry e;e
你能告诉我你会怎么做吗?或者有什么不对劲吗?
感谢您的帮助我发现while循环比循环更适合迭代,但可能只有我:)
公共静态空隙值(图m1、图m2){
迭代器iter=m1.keySet().Iterator();
while(iter.hasNext()){
K key=iter.next();
设置值=m1.get(键);
m2.put(键,新数组列表(值));
}
}
不是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);
}
}
公共静态空隙值(图m1、图m2)
{
对于(K键:m1.keySet())
{
设置source=m1.get(键);
List dest=m2.get(键);
如果(dest==null)
{
dest=newarraylist();
m2.放置(键,目标);
}
目的地加全部(来源);
}
}
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;
}
公共静态空隙值(地图m1、最终地图m2){
如果(m1==null)
抛出新的IllegalArgumentException(“空映射1”);
如果(m2==null)
抛出新的IllegalArgumentException(“空映射2”);
对于(Map.Entry e:m1.entrySet()){
m2.put(e.getKey(),newarraylist(e.getValue());
}
}
公共静态映射值(映射m){
如果(m==null)
抛出新的IllegalArgumentException(“空映射”);
Map m2=新的HashMap(Math.max(
(内部)(m.尺寸()/0.75f)+1,16),0.75f);
对于(Map.Entry e:m.entrySet()){
m2.put(e.getKey(),newarraylist(e.getValue());
}
返回m2;
}
如果可以的话,我强烈建议您使用MultiMap。谷歌有一个很棒的界面。有两个子接口:
相当于SetMultimap
Map
相当于ListMultimap
Map
public static <K, E> void values(Multimap<K, E> m1, Multimap<K, E> m2) {
m2.putAll(m1);
}
公共静态无效值(多贴图m1、多贴图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 =)
Multimap map1=HashMultimap.create();
map1.放置(“a”、“第一”);
map1.put(“a”,“second”);
map1.put(“b”、“第三”);
map1.get(“a”);/>返回[“第一”、“第二”]
map1.get(“b”);/>返回[“第三”]
map1.get(“c”);/>返回[],空集=)
非常感谢您!所以,键集只会将m1中的值放入迭代器,对吗?是的。Keyset为您提供了一组所有m1键:)或者您可以使用entry set,它可以避免为每个键调用get()。谢谢您的回答,但什么是receiver?哎呀,我将“receiver”重命名为“dest”,但看起来好像我错过了这一行。看起来不错,但我认为显式设置初始容量有点过火,可能会让人困惑。
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 =)