Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从map或arraylist中删除多个发生值_Java - Fatal编程技术网

Java 从map或arraylist中删除多个发生值

Java 从map或arraylist中删除多个发生值,java,Java,我有一个地图,上面有重复的值 我想要这张地图 ("A", "1"); ("B", "2"); ("C", "2"); ("D", "3"); ("E", "3"); 如果是单子呢 如果列表包含{1,2,2,3,3,4,5} 我想要{1,4,5}这是两个任务的Java-8解决方案: ("A", "1"); 公共静态映射节点(映射输入){ 映射计数=input.entrySet().stream() .collect(groupingBy(Entry::getVa

我有一个地图,上面有重复的值

我想要这张地图

("A", "1");    ("B", "2");    ("C", "2");    ("D", "3");    ("E", "3");    
如果是单子呢

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


我想要
{1,4,5}

这是两个任务的Java-8解决方案:

("A", "1");
公共静态映射节点(映射输入){
映射计数=input.entrySet().stream()
.collect(groupingBy(Entry::getValue));
返回计数
.values().stream().filter(列表->列表.size()==1)
.collect(toMap(list->list.get(0.getKey(),list->list.get(0.getValue()));
}
公共静态列表节点(集合输入){
LinkedHashMap计数=input.stream()
.collect(groupby(Function.identity(),LinkedHashMap::new,counting());
返回计数
.entrySet().stream().filter(e->e.getValue()==1l)
.map(Entry::getKey).collect(toList());
}

以下是针对ArrayList案例的Java 7解决方案:

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());
}
Map counts=newhashmap();
for(字符串元素:列表){
整数计数=计数。获取(elem);
如果(计数=null){
计数。放置(元素1);
}否则{
计数。放置(元素,计数+1);
}
}
Iterator it=list.Iterator();
while(it.hasNext()){
int count=counts.get(it.next());
如果(计数>1){
it.remove();
}
}
请注意,这是没有效率的。在最坏的情况下,它是
O(N^2)
,因为
it.remove()
O(N)
操作,用于
ArrayList


然而,了解需要采取的基本方法就足够了。(Tagir的Java 8解决方案所做的工作与此代码大致相同……只是它们在构建列表并计算列表长度,而不是计数。)

我看不出这些值是如何为地图复制的。。但是你可以使用一个用于你的值列表。键是唯一的,值不必是唯一的。为什么不将值设置为键,反之亦然?或者,现在,钥匙也应该是独一无二的吗?你能澄清一下你想要的是什么吗?看起来您希望完全删除所有副本,包括原始副本。你只是想保留唯一的值吗?@danielson如果我们这样做,我希望(a,1),(b,2),(d,3)会有结果。我不想挑剔,但你的标题有点不正确。您不希望删除重复的值,而是希望删除多次出现的所有值。这就是为什么Gosu和Danielson的建议行不通的原因。删除重复项意味着保留原始值。这里不是这样的。嗨,Tagir,这只在java-8中可能吗?或者在以前的版本中也可能。Hi,Tagir,我是java的初学者。如果你能帮助我编写简单的代码,我有[f,l,a,p,a,f]列表,我希望我的列表是[l,p]。我不明白什么是新的,计数()和收集(toList())非常感谢斯蒂芬。你能给我地图的解吗?你能把ArrayList解推广到地图解吗。你自己试试看。这将有利于您的编程能力:-)
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();
    }
}