("A", "1"); ("B", "2"); ("C", "2"); ("D", "3"); ("E", "3");
我有一张上面有重复值的地图
我想要地图
("A", "1");
如果是列表
如果列表包含{1,2,2,3,3,4,5}
我想要{1,4,5}
答案 0 :(得分:3)
以下是ArrayList案例的Java 7解决方案:
Map<String, Integer> counts = new HashMap<>();
for (String elem : list) {
Integer count = counts.get(elem);
if (count == null) {
counts.put(elem, 1);
} else {
counts.put(elem, count + 1);
}
}
Iterator<String> it = list.iterator();
while (it.hasNext()) {
int count = counts.get(it.next());
if (count > 1) {
it.remove();
}
}
请注意,这效率不高。在最坏的情况下,它是O(N^2)
,因为it.remove()
是O(N)
的{{1}}操作。
但是,理解需要采取的基本方法应该足够了。 (Tagir的Java 8解决方案与此代码大致相同......除了它们构建列表并获取列表长度而不是计算。)
答案 1 :(得分:1)
这是两个任务的Java-8解决方案:
public static <K, V> Map<K, V> noDups(Map<K, V> input) {
Map<V, List<Entry<K, V>>> counts = input.entrySet().stream()
.collect(groupingBy(Entry::getValue));
return counts
.values().stream().filter(list -> list.size() == 1)
.collect(toMap(list -> list.get(0).getKey(), list -> list.get(0).getValue()));
}
public static <T> List<T> noDups(Collection<T> input) {
LinkedHashMap<T, Long> counts = input.stream()
.collect(groupingBy(Function.identity(), LinkedHashMap::new, counting()));
return counts
.entrySet().stream().filter(e -> e.getValue() == 1l)
.map(Entry::getKey).collect(toList());
}