有没有更好的方法在java中组合两个字符串集?
我需要合并两个字符串集,同时过滤掉冗余信息,这是我提出的解决方案,有没有更好的方法可以推荐?也许是我忽略的内在因素?没有任何运气与谷歌有没有更好的方法在java中组合两个字符串集?,java,set,Java,Set,我需要合并两个字符串集,同时过滤掉冗余信息,这是我提出的解决方案,有没有更好的方法可以推荐?也许是我忽略的内在因素?没有任何运气与谷歌 Set<String> oldStringSet = getOldStringSet(); Set<String> newStringSet = getNewStringSet(); for(String currentString : oldStringSet) { if (!newStringSet.contains(cur
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
Set-oldStringSet=getOldStringSet();
Set newStringSet=getNewStringSet();
用于(字符串currentString:oldStringSet)
{
如果(!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
由于集合
不包含重复条目,因此您可以通过以下方式将两者结合起来:
newStringSet.addAll(oldStringSet);
添加两次并不重要,集合只包含一次元素。。。e、 g无需使用包含方法进行检查。)
由于集合不能有重复项,只需将其中一个集合的所有元素添加到另一个集合中,即可生成两个集合的正确并集。只需使用newStringSet.addAll(oldStringSet)
。无需检查重复项,因为Set
实现已执行此操作。Set.addAll()
如果指定集合中的所有元素尚未存在,则将它们添加到此集合(可选操作)。如果指定的集合也是一个集合,addAll操作将有效地修改该集合,使其值为两个集合的并集
newStringSet.addAll(oldStringSet)
使用布尔addAll(集合
这将根据定义集生成s1和s2的并集,该定义集仅包含唯一元素
Set<String> distinct = new HashSet<String>();
distinct.addAll(oldStringSet);
distinct.addAll(newStringSet);
Set distinct=new HashSet();
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;
}
publicstaticset-distinct(集合…列表){
Set distinct=新的HashSet();
对于(集合列表:列表){
distinct.addAll(列表);
}
回归清晰;
}
您可以使用这一行程序来完成
Set<String> combined = Stream.concat(newStringSet.stream(), oldStringSet.stream())
.collect(Collectors.toSet());
Set combined=Stream.concat(newStringSet.Stream(),oldStringSet.Stream())
.collect(收集器.toSet());
通过静态导入,它看起来更漂亮
Set<String> combined = concat(newStringSet.stream(), oldStringSet.stream())
.collect(toSet());
Set combined=concat(newStringSet.stream(),oldStringSet.stream())
.收集(toSet());
另一种方法是使用方法:
Set combined=Stream.of(newStringSet,oldStringSet).flatMap(Set::Stream)
.收集(toSet());
此外,任何集合都可以轻松地与单个元素组合
Set<String> combined = concat(newStringSet.stream(), Stream.of(singleValue))
.collect(toSet());
Set combined=concat(newStringSet.stream(),stream.of(singleValue))
.收集(toSet());
与以下内容相同:
Set combinedSet=Set.union(oldStringSet,newStringSet)
如果您关心性能,并且不需要保留两个集合,而且其中一个集合可能很大,我建议您检查哪个集合最大,并从最小集合添加元素
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;
}
Set newStringSet=getNewStringSet();
Set oldStringSet=getOldStringSet();
设置我的结果;
if(oldStringSet.size()>newStringSet.size()){
addAll(newStringSet);
myResult=oldStringSet;
}否则{
newStringSet.addAll(oldStringSet);
myResult=newStringSet;
}
这样,如果新集合有10个元素,而旧集合有100000个元素,则只需执行10个操作,而不是100000个操作。如果使用Guava,还可以使用生成器获得更大的灵活性:
ImmutableSet.<String>builder().addAll(someSet)
.addAll(anotherSet)
.add("A single string")
.build();
ImmutableSet.builder().addAll(someSet)
.addAll(另一组)
.add(“单个字符串”)
.build();
如果您使用的是Apache Common,请使用org.Apache.commons.collections4.SetUtils;
SetUtils.union(setA, setB);
这比addAll好多少?@KKlalala,您的需求将决定哪个更好。addAll
和使用流之间的主要区别是:•使用set1.addAll(set2)
将产生物理更改set1
内容的副作用•但是,使用流将始终导致Set
的一个新实例包含两个集合的内容,而无需修改任何一个原始集合实例。IMHO此答案更好,因为它避免了副作用和可能的une如果原始集在其他地方使用时需要原始内容,则会对原始集进行预期更改。hth这还具有支持不可变集的优点。请参阅:set::union是一个很好的用于收集器的二进制运算符。reduce()这是一个非常好的逻辑,我无法想象为什么它不在主addAll方法参数中,比如public boolean addAll(int index,CollectionI猜测是因为规范本身:将指定集合中的所有元素添加到此集合。您确实可以有另一个方法,但如果它不遵循与其重载的方法相同的规范,则会非常混乱。是的,我是说oneNote此returns是一个不可变的SetView
。从SetView
获取size()也是一个线性操作。
Set<String> combinedSet = Sets.union(oldStringSet, newStringSet)
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;
}
ImmutableSet.<String>builder().addAll(someSet)
.addAll(anotherSet)
.add("A single string")
.build();
SetUtils.union(setA, setB);