无论是什么情况,我都需要从String的ArrayList中删除重复项。对于eq:
List list = Lists.newArrayList("Luke","luke");// it's guava's method
list.stream().distinct();
上面的 distinct()
不会做任何帮助,因为它适用于将返回false的equals方法。有没有其他方法可以做类似的事情:
list.stream().distinct((a,b)->a.equalsIgnoreCase(b)).collect(..);
更新:
它可能与possible duplicate不同,因为可能重复的答案会显示如何使用地图将distinct()
与属性结合使用。但是一张包含" Luke"如果添加" luke"将不会返回true因此,这些答案对这个问题不起作用。
答案 0 :(得分:0)
这是一种方法。我假设重复项不需要彼此相邻,所以我不得不使用HashSet来保持O(n)。此外,还必须就案件达成一致(小写)。
public static void main(String[] args) {
List<String> list = Arrays.asList("Luke", "tony", "Tony", "luke");
Set<String> set = new HashSet<>();
list.stream().map(s -> s.toLowerCase()).filter(s -> !set.contains(s)).forEach(set::add);
System.out.println(set);
}
答案 1 :(得分:0)
以下是使用本地课程的可能性:
public List<String> yourFunction(List<String> list) {
class IgnoringCase {
String wrapped;
public IgnoringCase(String w) { wrapped = w; }
public boolean equals(Object o) {
if (o instanceof IgnoringCase) {
IgnoringCase other = (IgnoringCase) o;
return wrapped.equalsIgnoreCase(other.wrapped);
} return false;
}
}
return list.stream()
.map(IgnoringCase::new) // enable alternative equals
.distinct()
.map(i -> i.wrapped) // map back to String
.collect(toList());
}
显然,没有必要将本地化为本地,如果你更喜欢它,你可以使用静态嵌套或顶级类。