我需要结合两个字符串集,同时过滤掉冗余信息,这是我提出的解决方案,有没有更好的方法,任何人都可以建议?也许是我忽视的东西?谷歌没有运气。
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
答案 0 :(得分:103)
由于Set
不包含重复的条目,因此您可以将两者结合起来:
newStringSet.addAll(oldStringSet);
如果你添加两次东西并不重要,该集合只会包含一次元素......例如,不需要使用contains
方法进行检查。
答案 1 :(得分:63)
你可以使用这个单行
来做到这一点Set<String> combined = Stream.concat(newStringSet.stream(), oldStringSet.stream())
.collect(Collectors.toSet());
使用静态导入它看起来更好
Set<String> combined = concat(newStringSet.stream(), oldStringSet.stream())
.collect(toSet());
另一种方法是使用flatMap方法:
Set<String> combined = Stream.of(newStringSet, oldStringSet).flatMap(Set::stream)
.collect(toSet());
任何集合都可以轻松地与单个元素组合
Set<String> combined = concat(newStringSet.stream(), Stream.of(singleValue))
.collect(toSet());
答案 2 :(得分:16)
与Guava相同:
Set<String> combinedSet = Sets.union(oldStringSet, newStringSet)
答案 3 :(得分:9)
从定义Set中仅包含唯一元素。
Set<String> distinct = new HashSet<String>();
distinct.addAll(oldStringSet);
distinct.addAll(newStringSet);
要增强代码,您可以为该代码创建通用方法
public static <T> Set<T> distinct(Collection<T>... lists) {
Set<T> distinct = new HashSet<T>();
for(Collection<T> list : lists) {
distinct.addAll(list);
}
return distinct;
}
答案 4 :(得分:4)
只需使用newStringSet.addAll(oldStringSet)
即可。无需检查重复项,因为Set
实现已经这样做了。
答案 5 :(得分:3)
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection)
由于集合不能重复,只需将一个元素添加到另一个元素就会生成两者的正确结合。
答案 6 :(得分:3)
newStringSet.addAll(oldStringSet);
这将产生s1和s2的联盟
答案 7 :(得分:2)
Set.addAll()
如果指定集合中的所有元素尚未存在(可选操作),则将其添加到此集合中。如果指定的集合也是一个集合,则addAll操作会有效地修改此集合,使其值为两个集合的并集
newStringSet.addAll(oldStringSet)
答案 8 :(得分:2)
使用boolean addAll(Collection<? extends E> c)
如果指定集合中的所有元素尚未存在(可选操作),则将其添加到此集合中。如果指定的集合也是一个集合,则addAll操作会有效地修改此集合,使其值为两个集合的并集。如果在操作正在进行时修改指定的集合,则此操作的行为是不确定的。
newStringSet.addAll(oldStringSet)
答案 9 :(得分:1)
如果您关心性能,并且不需要保留两个集合而其中一个集合可能很大,那么我建议检查哪个集合最大,并从最小的集合中添加元素。
Set<String> newStringSet = getNewStringSet();
Set<String> oldStringSet = getOldStringSet();
Set<String> myResult;
if(oldStringSet.size() > newStringSet.size()){
oldStringSet.addAll(newStringSet);
myResult = oldStringSet;
} else{
newStringSet.addAll(oldStringSet);
myResult = newStringSet;
}
这样,如果您的新集合有10个元素,而旧集合有10万个,则您只需要执行10次操作,而不是100 000次。
答案 10 :(得分:0)
如果您使用的是番石榴,还可以使用构建器来获得更大的灵活性:
ImmutableSet.<String>builder().addAll(someSet)
.addAll(anotherSet)
.add("A single string")
.build();
答案 11 :(得分:0)
如果您使用的是Apache Common,请使用SetUtils
中的org.apache.commons.collections4.SetUtils;
类
SetUtils.union(setA, setB);