有没有更好的方法在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);