我有以下HashMap(HashMap<String, String[]>
)并且想知道,是否存在从特定键的数组中删除特定String的方法。
我发现只有基于某个值删除一个键的方法,例如,我有:
("key1", new String[]{"A", "B", "C"})
如何只删除B?
答案 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 的良好初始容量来加快进度。