在创建ArrayList时添加元素

时间:2016-11-30 09:18:55

标签: java arraylist collections

我有一个HashMap

myMap = new HashMap<String, ArrayList<String> >();

我正在编写一个代码,我想在ArrayList中为该密钥添加项目(如果它存在于地图中),

myMap.get(key).add(element);

或创建新的ArrayList,将项目添加到列表中,然后将此列表添加到地图中。

ArrayList<String> tmpArrList = new ArrayList<>();
tmpArrList.add(element);
myMap.put(key, tmpArrayList);

写三行添加单个元素,对我不好看,我怎么能 使用Java 5将它写成单行 ..?

3 个答案:

答案 0 :(得分:2)

如果您使用的是Java 8,则computeIfAbsent就是您所需要的:

myMap.computeIfAbsent(key, ArrayList::new).add(element);

如果ArrayList中尚未提供请求的密钥,则会生成新的Map并将其放入Map

答案 1 :(得分:1)

由于您需要 Java 5 的解决方案,您可以做的最好的事情就是简化:

ArrayList<String> tmpArrList = new ArrayList<>();
tmpArrList.add(element);
myMap.put(key, tmpArrayList);

有了这个:

myMap.put(key, new ArrayList<String>(Collections.singletonList(element)));

或者允许在地图中添加条目的代码可以是:

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

您还可以考虑使用Multimap中的Google Guava,但请注意,它仅针对 Java 6 表示最新版本,希望现有 {5} 版本13.014.016.017.0可从here获取,更多详情here。< / p>

以下是如何使用它的示例:

ListMultimap<String, String> myMap = ArrayListMultimap.create();
// This will map the provided key with the provided value whetever the
// total amount of values already mapped with this key  
myMap.put(key, element);

答案 2 :(得分:1)

  

我怎样才能用单行编写..? (来自问题)
  我必须写一些支持Java 1.5及以上的东西(来自comment

你不能。编写它的最短方式是:

string commandArguments = Environment.GetCommandLineArgs();

string arg1 = null;
string arg2 = null;
string arg3 = null;
bool isCmdLineOk = TryGetArg(commandArguments, "-r", out arg1) &&
                   TryGetArg(commandArguments, "-n", out arg2) &&
                   TryGetArg(commandArguments, "-p", out arg3);
if (isCmdLineOk)
{
    // do something with `arg1`, `arg2`, `arg3`.
}
else
{
    // not all of `arg1`, `arg2`, `arg3` could be set to a value.
    Console.WriteLine("Parameters structure is inconsistent");
}

这是优化为仅执行一次地图查找,与使用ArrayList<String> list = myMap.get(key); if (list == null) myMap.put(key, list = new ArrayList<String>()); list.add(element); 检测是否需要新containsKey()的实现不同。

除了:

  1. 只需将其全部写在一行 *

    ArrayList

    *是的,这是一个笑话,虽然从技术上讲是一个有效的答案。

  2. 创建辅助方法,例如在共享实用程序类中:

    ArrayList<String> list = myMap.get(key); if (list == null) myMap.put(key, list = new ArrayList<String>()); list.add(element);
    

    然后使用它是一行:

    public static <K, V> void addToMapList(Map<K, ArrayList<V>> mapList, K key, V value) {
        ArrayList<V> list = mapList.get(key);
        if (list == null)
            mapList.put(key, list = new ArrayList<V>());
        list.add(value);
    }
    
  3. 使用Apache Commons Collections ™ * MultiValueMap

    MyUtil.addToMapList(myMap, key, element);
    

    *对于Java 5,请使用4.0版。

  4. 使用Google Guava * ArrayListMultimap

    MultiMap<String, String> myMap = new MultiValueMap<String, String>();
    
    myMap.put(key, element);
    

    *对于Java 5,请使用version 11.0

  5. 自己编写ListMultimap<String, String> myMap = ArrayListMultimap.create(); myMap.put(key, element);