繁体   English   中英

如何将值添加到哈希图中单个键的值列表中(Java)

[英]How to add a value to a list of values for a single key in a hashmap (Java)

我写了这个:

HashMap<String, String> map1 = new HashMap<String, String>();
Map<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>();

我试图为哈希图中的每个键允许大于1的值。 因此,如果第一个键是“ 1”,我想允许将“ 1”与值“ 2”和“ 3”配对。

就像这样:

1 --> 2
|--> 3

但是当我这样做时:

map2.put(key, value);

它给出了表示“不兼容类型”的错误,并且无法将其转换为ArrayList,并且表示错误在行的value部分。

如果您使用的是Java 8,则可以轻松完成此操作:

String key = "someKey";
String value1 = "someValue1";
String value2 = "someValue2";

Map<String, List<String>> map2 = new HashMap<>();
map2.computeIfAbsent(key, k -> new ArrayList<>()).add(value1);
map2.computeIfAbsent(key, k -> new ArrayList<>()).add(value2);
System.out.println(map2);

Map.computeIfAbsent(...)文档中有很多此示例。

map2您仅需要添加ArrayList (您将其声明为Map<String, ArrayList<String>> -第二个是值类型),这就是为什么它为您提供了不兼容的类型

您需要使用ArrayList初始化键,并在以后向其添加对象:

if (!map2.containsKey(key)) {
    map2.put(key, new ArrayList<String>());
}
map2.get(key).add(value);

或者,您可以使用番石榴中的Multimap ,然后可以只map2.put ,它不会覆盖那里的值,而是添加到列表中。

这是因为Java中的标准Map实现仅存储一对(oneKey,oneValue)。 在Java标准Map中存储特定键的多个值的唯一方法是将“集合”存储为值,然后您需要通过键访问此集合(从Map),然后将该集合“值”用作常规集合,在您的示例中为ArrayList。 因此,您不必直接通过map.put放置某些内容(创建空集合除外),而是可以通过键获取整个集合并使用此集合。

您需要像Multimap这样的东西,例如:

      public class Multimap<T,S> {
         Map<T, ArrayList<S>> map2 = new HashMap<T, ArrayList<S>>();

         public void add(T key, S value) {
           ArrayList<T> currentValuesForGivenKey = get(key);
           if (currentValuesForGivenKey == null) {
              currentValuesForGivenKey = new ArrayList<T>();
              map2.get(key, currentValuesForGivenKey);
           }
           currentValuesForGivenKey.add(value);
         }

         public ArrayList<S> get(T key) {
           ArrayList<String> currentValuesForGivenKey = map2.get(key);
           if (currentValuesForGivenKey == null) {
              currentValuesForGivenKey = new ArrayList<S>();
              map2.get(key, currentValuesForGivenKey);
           }
           return currentValuesForGivenKey;
         }

        }

那么您可以像这样使用它:

Multimap<String,String> map2 = new Multimap<String,String>();

map2.add("1","2");
map2.add("1","3");
map2.add("1","4");

for (String value: map2.get("1")) {
  System.out.println(value);
}

将打印:

2
3
4

您与您要做的事情有点距离。

Map<String, ArrayList<String>> map2 = new HashMap<String, ArrayList<String>>();

这将仅允许将String作为键,将ArrayList作为值。 因此,您必须尝试以下操作:

 ArrayList<String> value=new ArrayList<String>();
 value.add("2");
 value.add("3");
 map2.put("1", value);

检索时,您还必须遵循相反的步骤。

 ArrayList<String> valueTemp=map2.get("1");

然后您可以遍历此ArrayList以获得那些值(“ 2”和“ 3”);

尝试这样。 //使用列表或set ..但set避免重复

Map<String, Set<String>> map = new HashMap<>();
 Set<String> list = new HashSet<>();

// add value to the map

 Boolean b = map.containsKey(key);
                if (b) {
                    map.get(key).addAll(list);
                } else
                    map.put(key, list);
            }

您不能在地图的同一键中添加不同的值。 Map会覆盖该键中的值。 您可以这样操作。

Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
ArrayList<String> list=new ArrayList<String>();
 list.add("2");
 list.add("3");
 map.put("1", list);

首先在数组列表中添加值,然后放入map中。

它给出了表示“不兼容类型”的错误,并且无法将其转换为ArrayList,并且表示错误在行的值部分。

因为,它不会自动转换为ArrayList

您应该将两个值都添加到列表中,然后将该列表放入地图中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM