- ★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net
112 :デフォルトの名無しさん[sage]:2015/07/07(火) 07:55:16.93 ID:imZ4ShMS - 質問ですが、重複なしの順序付きリスト (ArrayList の set版) は (LinkedHashSet 以外は)ないのでしょうか。
ArrayList のように、add() 順に配列として保持しておきたいけど、重複はなしにしたい(set系)というときに、 HashSet は順不同ですし、TreeSetではソートが発生して順序が保存されません。 だとすると LinkedHashSet がぴったりだと思うのですが、別に Hashテーブルが欲しいというわけでもなく、前方後方リンクという挿入・削除の実装を重視したいのではなく、単に配列でよいだけなので、LinkedHashSetだと、あまりパフォーマンスがよくなさそうです。 ごく単純にArraySet のようなものがあれば良いだけに思うのですが、これだけ単純なものなら自分の知らない何かのクラスがあるのか?と思ったので・・・ こういう場合、自前で重複チェックを実装して ArrayList を使うものですか?
|
- ★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net
117 :112[sage]:2015/07/07(火) 13:32:48.41 ID:imZ4ShMS - >>113-114 ありがとうございます。
>>113 これだと、arraylist側には重複が生じて、hashset の計算もあってパフォーマンスが悪くなるような・・・ >>114 そうなんですよね。簡単な実装だからこそ、なんでここまで単純なものがクラスとして用意されていないのか、理由があるのかな?と思って。 実際には、add処理に一段かまして、 if (list.contains(item)) { list.add(item); } をするだけなので、ArraySet extends ArrayList のクラスを作って override して重複なし保証のクラスとしてあちこちで使っています。
|
- ★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net
118 :112[sage]:2015/07/07(火) 13:34:05.10 ID:imZ4ShMS - >>117
!が抜けていました。l to !がみにくい!! if (!list.contains(item)) { list.add(item); } です。
|
- ★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net
126 :112[sage]:2015/07/07(火) 20:24:35.20 ID:imZ4ShMS - >>120
大体1万くらいなんで、大したことはないかと 逆に1億とかになったら、linkedList系はきついので、アクセス速度を考えてHashSetにするかも・・・ >>121 いや、大したこと無いと思う 1万のリスト、重複2000くらいのを回して 40ms くらいだった。 たしかに contains 重そうだけど、このくらいの数だと Hashよりは速いみたい
|
- ★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net
139 :112[sage]:2015/07/07(火) 23:20:40.56 ID:imZ4ShMS - >>127
ありがとうございます。ほんとだw Integer と 500文字くらいのString の2種類で100〜100000個のデータの重複あり(35%くらい重複で大体65個前後登録になる)でやってみたら ArrayHashSet<E> が圧倒した・・・下みたいな感じになったけど、Hashは速いなー 100個: ArrayHashSet<Integer>1[ms] --- Set.size()=66 100個: ArraySet<Integer>1[ms] --- Set.size()=66 100個: ArrayHashSet<String>1[ms] --- Set.size()=66 100個: ArraySet<String>0[ms] --- Set.size()=66 1000個: ArrayHashSet<Integer>1[ms] --- Set.size()=636 1000個: ArraySet<Integer>4[ms] --- Set.size()=636 1000個: ArrayHashSet<String>4[ms] --- Set.size()=636 1000個: ArraySet<String>7[ms] --- Set.size()=636 10000個: ArrayHashSet<Integer>1[ms] --- Set.size()=6331 10000個: ArraySet<Integer>259[ms] --- Set.size()=6331 10000個: ArrayHashSet<String>24[ms] --- Set.size()=6331 10000個: ArraySet<String>661[ms] --- Set.size()=6331 100000個: ArrayHashSet<Integer>10[ms] --- Set.size()=63071 100000個: ArraySet<Integer>23866[ms] --- Set.size()=63071 100000個: ArrayHashSet<String>222[ms] --- Set.size()=63071 100000個: ArraySet<String>131142[ms] --- Set.size()=63071
|
- ★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net
140 :112[sage]:2015/07/07(火) 23:26:54.72 ID:imZ4ShMS - ↑すまない・・・専ブラの人には誤爆リンクできまくりですね・・・こりゃひどい
うーん。やっぱり、なんでArrayHashSet ってもともと java.util あたりにないんだろうって思う。 >>127 の実装だから自分でつくれ、ってことなのかなぁ。
|
- ★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net
141 :112[sage]:2015/07/07(火) 23:51:57.75 ID:imZ4ShMS - ArrayHashSet でググると、ちょこちょこ作っているプロジェクトがあるんですね
Arrayの要素がなくなってるやつも、ちらほらありますけど・・・ なんにせよ、スピード重視ならArrayHashSet 一択っぽいですね。消費メモリもまあたいして変わらん・・・と思う。 ありがとうございました >レスをくれた皆様
|