トップページ > プログラム > 2015年07月07日 > imZ4ShMS

書き込み順位&時間帯一覧

5 位/215 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000100000200000010037



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
112
★★Java質問・相談スレッド174★★ [転載禁止]©2ch.net

書き込みレス一覧

★★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 一択っぽいですね。消費メモリもまあたいして変わらん・・・と思う。
ありがとうございました >レスをくれた皆様


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。