从map或arraylist中删除多个出现值

时间:2015-07-06 12:48:47

标签: java

("A", "1");    ("B", "2");    ("C", "2");    ("D", "3");    ("E", "3");    

我有一张上面有重复值的地图

我想要地图

("A", "1");

如果是列表

如果列表包含{1,2,2,3,3,4,5}

我想要{1,4,5}

2 个答案:

答案 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());
}