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