实际上,我知道如何减少重复的distinct()
,或者将list
分配给set
,但我有一个不同的问题。如何在Java8中使用stream或者可能是Streamex
来解决以下智能方式的问题?
假设列表中有一个对象
A,A,A,B,B,A,A,A,C,C,C,A,B,B,A
您可以编写一个有状态筛选器,但绝不应该这样做,因为它违反了筛选器(谓词<?super t>谓词)
的约定:
谓词
-应用于每个元素以确定是否应该包含该元素的非干扰、无状态谓词
public class NoRepeatFilter<T> implements Predicate<T> {
private T prevValue;
@Override
public boolean test(T value) {
if (value.equals(this.prevValue))
return false;
this.prevValue = value;
return true;
}
}
测试
List<String> result = Stream
.of("A", "A", "A", "B", "B", "A", "A", "A", "C", "C", "C", "A", "A", "B", "B", "A")
// .parallel()
.filter(new NoRepeatFilter<>())
.collect(Collectors.toList());
System.out.println(result);
一个有效的解决方案是使用(...)创建自己的
收集器
:
public class NoRepeatCollector {
public static <E> Collector<E, ?, List<E>> get() {
return Collector.of(ArrayList::new,
NoRepeatCollector::addNoRepeat,
NoRepeatCollector::combineNoRepeat);
}
private static <E> void addNoRepeat(List<E> list, E value) {
if (list.isEmpty() || ! list.get(list.size() - 1).equals(value))
list.add(value);
}
private static <E> List<E> combineNoRepeat(List<E> left, List<E> right) {
if (left.isEmpty())
return right;
if (! right.isEmpty())
left.addAll(left.get(left.size() - 1).equals(right.get(0))
? right.subList(1, right.size()) : right);
return left;
}
}
测试
List<String> result = Stream
.of("A", "A", "A", "B", "B", "A", "A", "A", "C", "C", "C", "A", "A", "B", "B", "A")
// .parallel()
.collect(NoRepeatCollector.get());
System.out.println(result);
输出(包含和不包含
.parallel()
)
public static <E> void removeRepeats(Iterable<E> iterable) {
E prevValue = null;
for (Iterator<E> iter = iterable.iterator(); iter.hasNext(); ) {
E value = iter.next();
if (value.equals(prevValue))
iter.remove();
else
prevValue = value;
}
}
List<String> list = new ArrayList<>(Arrays.asList(
"A", "A", "A", "B", "B", "A", "A", "A", "C", "C", "C", "A", "A", "B", "B", "A"));
removeRepeats(list);
System.out.println(list);
问题内容: 我想从列表中删除重复项,但我无法正常工作: 问题答案: 如果该代码不起作用,则可能是你未在该类上正确实现。 大概有一些钥匙(我们称之为)可以唯一地标识一个客户。例如 的适当定义equals(Object)如下所示: 为了完整起见,你还应该实现hashCode两个Customer相等的对象将返回相同的哈希值。hashCode上述定义的匹配项为equals: 还值得注意的是,如果列表很大,
我有一本这样的字典: 我怎么才能把匕首从上面取下来? 我试过这个: 或 但它犯了这个错误:
问题内容: 编写一个程序来检查列表中是否有重复项,如果删除了重复项,则将其删除,并返回一个包含未重复项/已删除项的新列表。这就是我所拥有的,但老实说我不知道该怎么办。 问题答案: 获取唯一项目集合的常用方法是使用。集是不同对象的无序集合。要从任何迭代创建集合,只需将其传递给内置函数即可。如果以后再次需要真实列表,则可以类似地将集合传递给函数。 以下示例应涵盖你尝试做的所有事情: 从示例结果中可
我下面有一个类,想删除包含同名的重复人,如何使用Java8 Lambda,预计列表包含下面的p1、p3。
问题内容: 我已向客户提供以下查询,以删除重复的电话号码。记录在MSSQL数据库中,但现在他们也需要在MySQL上进行记录,并且他们报告MySQL抱怨查询的格式。我已经包含了一个测试表的设置,该测试表具有重复的代码示例,但是真正重要的是删除查询。 我在无知和紧急情况下问这个问题,因为我仍在忙于下载和安装MySQL,在此期间也许有人可以提供帮助。 问题答案: 通往罗马的途径很多。这是一。非常快。因此
问题内容: 我将如何使用python检查列表并删除所有重复项?我不需要指定重复项是什么- 我希望代码找出是否存在重复项,如果有则将其删除,每个重复项仅保留一个实例。如果列表中有多个重复项,它也必须起作用。 例如,在下面的代码中,列表lseparatedOrbList有12个项目-一项被重复六次,一项被重复五次,并且只有一个实例。我希望它更改列表,因此只有三项-每一项,并且它们之前出现的顺序相同。我