1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

javaで2つのSetの要素を足したい時の書き方あれこれ

Last updated at Posted at 2021-10-03

2つのSetの要素を足したい時があり、その時に実装悩んだので共有です。
オススメ度順に上から並べています。

GuavaのIterablesを使う

一番スッキリしてる気がする

return Sets.newHashSet(Iterables.concat(hashSet1, hashSet2));

それぞれStreamにしてからStream.concat()でつなげる

王道な気がする

return Stream.concat(
    hashSet1.stream(),
    hashSet2.stream())
    .collect(Collectors.toSet());

SetのStreamをflatMapでStreamをつくる

ちょっとぱっと見わかりにくい気もする

return Stream.of(hashSet1, hashSet2)
    .flatMap(Collection::stream)
    .collect(Collectors.toSet());

Set.addAll()を使う

戻り値がbooleanなのが残念・・・
return set1.addAll(set2);みたいな感じに書きたかった。

Set<String> result = new HashSet<>();
result.addAll(set1);
result.addAll(set2);
return result;

補足:速度検証

それぞれの速度を検証してみました。
100個のランダムな1000以下の数字のStringのSetを足しています。
1000000回演算を行って、平均から時間を取得しています。

5240ns
4002ns
4162ns
3974ns

結果は、最初のGuavaを使う場合が微妙に遅いですね。
1.5倍弱なのでそんなに差は無い気もしますが頭の片隅にいれておいてもいいかもしれません。

速度検証のソースコードは以下に配置しました。

追記

中央値の方が速度の評価にはよいとFB受けたので中央値も計測してみました!

5043ns
3827ns
4033ns
3868ns
1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?