有没有更好的方法在java中组合两个字符串集?

时间:2012-01-30 10:39:40

标签: java

我需要结合两个字符串集,同时过滤掉冗余信息,这是我提出的解决方案,有没有更好的方法,任何人都可以建议?也许是我忽视的东西?谷歌没有运气。

Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();

for(String currentString : oldStringSet)
{
    if (!newStringSet.contains(currentString))
    {
        newStringSet.add(currentString);
    }
}

12 个答案:

答案 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);