从键中删除特定值(HashMaps)

时间:2016-07-02 14:45:41

标签: java hashmap key

我有以下HashMap(HashMap<String, String[]>)并且想知道,是否存在从特定键的数组中删除特定String的方法。

我发现只有基于某个值删除一个键的方法,例如,我有:

("key1", new String[]{"A", "B", "C"})

如何只删除B?

2 个答案:

答案 0 :(得分:2)

这是简单的Java解决方案:

map.computeIfPresent("key1", (k, v) -> Arrays.stream(v)
  .filter(s -> !s.equals("B")).toArray(String[]::new));

答案 1 :(得分:0)

您将获取特定键的值并从中删除给定值,然后将其放回到地图中。

public void <K> removeValueFromKey(final Map<K, K[]> map, final K key, final K value) {
    K[] values = map.get(key);
    ArrayList<K> valuesAsList = new ArrayList<K>(values.length);
    for (K currentValue : values) {
        if (!currentValue.equals(value)) {
            valuesAsList.add(currentValue);
        }
    }

    K[] newValues = new K[valuesAsList.size()];
    newValues = valuesAsList.toArray(newValues);
    map.put(key, newValues);
}

请注意,运行时当然与给定数组的大小呈线性关系。没有更快的方法,因为您需要遍历数组的每个元素以查找所有等于给定值的值。

但是,如果可行,您可以使用其他数据结构更快地实现。例如,优于数组,或者实现contains的任何其他数据结构都比O(n)更快。

同样适用于空间复杂性;你有一个峰值,你需要在内存中保存两个数组。这是因为数组的大小无法改变;该方法将构造一个新数组。因此,内存中将有两个数组O(2n)

Collection<String>可能是更好的解决方案,具体取决于您调用方法的频率,与地图保存的元素数量相比。

另一件事是你可以通过猜测 ArrayList 的良好初始容量来加快进度。