回答編集履歴

7

リンク先が違っていたので、修正!

2018/08/06 08:40

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  以下からはパフォーマンスを気にする人向けのコード。
58
58
 
59
- [List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/Collection.html#addAll-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
59
+ [java.util.List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/List.html#addAll-int-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
60
60
 
61
61
  ※最初の回答もそうですが、`Shallow Copy`な点に注意
62
62
 

6

追記

2018/08/06 08:40

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  パフォーマンスを気にしないのであれば以下のように。
26
26
 
27
- 2重ループでまわす一番理解しやすいと思えるコードです。(**未テストです**)
27
+ 2重ループでまわすコードです。(**未テストです**)
28
28
 
29
29
  ```Java
30
30
 
@@ -58,7 +58,7 @@
58
58
 
59
59
  [List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/Collection.html#addAll-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
60
60
 
61
- ※`Shallow Copy`な点に注意
61
+ 最初の回答もそうですが、`Shallow Copy`な点に注意
62
62
 
63
63
  ```diff
64
64
 

5

追記

2018/08/06 08:12

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  パフォーマンスを気にしないのであれば以下のように。
26
26
 
27
- 2重ループでまわす一番理解しやすいと思えるコードです。
27
+ 2重ループでまわす一番理解しやすいと思えるコードです。(**未テストです**)
28
28
 
29
29
  ```Java
30
30
 

4

インクリメント演算子がまちがってたああああ

2018/08/06 07:36

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  List<K> list = (List<K>) entries[i];
38
38
 
39
- for(int j=0;j < list.size();i++) {
39
+ for(int j=0;j < list.size();j++) {
40
40
 
41
41
  klist.add(list.get(j));
42
42
 

3

追記

2018/08/06 07:35

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -56,33 +56,27 @@
56
56
 
57
57
  以下からはパフォーマンスを気にする人向けのコード。
58
58
 
59
- [List#addAll](https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#addAll-java.util.Collection-)を使うと、コレクションの要素をコピーできます。
59
+ [List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/Collection.html#addAll-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
60
60
 
61
+ ※`Shallow Copy`な点に注意
62
+
61
- ```Java
63
+ ```diff
62
64
 
63
65
  List<K> list = (List<K>) entries[i];
64
66
 
65
- for(int j=0;j < list.size();i++) {
67
+ - for(int j=0;j < list.size();i++) {
66
68
 
67
- klist.add(list.get(j));
69
+ - klist.add(list.get(j));
68
70
 
69
- }
71
+ - }
72
+
73
+ + klist.addAll(list);
70
74
 
71
75
  ```
72
76
 
73
77
 
74
78
 
75
- ```Java
76
-
77
- List<K> list = (List<K>) entries[i];
78
-
79
- klist.addAll(list);
80
-
81
- ```
82
-
83
-
84
-
85
- 次に質問文のコードは`LinkedList`なので、[`RandomAccess`](https://docs.oracle.com/javase/jp/9/docs/api/java/util/RandomAccess.html)ができません。
79
+ 次に質問文のコードは`LinkedList`なので、[RandomAccess](https://docs.oracle.com/javase/jp/9/docs/api/java/util/RandomAccess.html)ができません。
86
80
 
87
81
  内部は`ArrayList`で持つほうがよいでしょう。
88
82
 
@@ -92,7 +86,11 @@
92
86
 
93
87
 
94
88
 
95
- 最後にもっとパフォーマンスを気にするのであれば、`entries`とは別に`hashcode`値のみを管理するint配列(buckets)を宣言して`loadFactor`に応じて`rehash`してくださいな。
89
+ 最後にもっとパフォーマンスを気にするのであれば、`entries`とは別に`hashcode`値のみを管理するint配列(`buckets`)を宣言して`loadFactor`に応じて`rehash`してくださいな。
90
+
91
+ あと多分スルーされたと思いますが、**キーのインプレース変更も防止**してくださいな。
92
+
93
+ 個人的にライブラリの`HashMap`を使わずに`HashTable`を再実装される方の義務だと思っているので・・・
96
94
 
97
95
 
98
96
 

2

追記

2018/08/06 07:32

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -13,3 +13,95 @@
13
13
  ◇余談
14
14
 
15
15
  `HashTableEntry`の`Key`はインプレース変更を防止するために、インスタンス変数は`final`で宣言してくださいな。
16
+
17
+
18
+
19
+ ---
20
+
21
+ > どうすればすべて取り出せるでしょうか
22
+
23
+
24
+
25
+ パフォーマンスを気にしないのであれば以下のように。
26
+
27
+ 2重ループでまわす一番理解しやすいと思えるコードです。
28
+
29
+ ```Java
30
+
31
+ public List<K> keys() {
32
+
33
+ List<K> klist = new LinkedList<K>();
34
+
35
+ for (int i = 0; i < this.entries.length; i++) {
36
+
37
+ List<K> list = (List<K>) entries[i];
38
+
39
+ for(int j=0;j < list.size();i++) {
40
+
41
+ klist.add(list.get(j));
42
+
43
+ }
44
+
45
+ }
46
+
47
+ return klist;
48
+
49
+ }
50
+
51
+
52
+
53
+ ```
54
+
55
+
56
+
57
+ 以下からはパフォーマンスを気にする人向けのコード。
58
+
59
+ [List#addAll](https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#addAll-java.util.Collection-)を使うと、コレクションの要素をコピーできます。
60
+
61
+ ```Java
62
+
63
+ List<K> list = (List<K>) entries[i];
64
+
65
+ for(int j=0;j < list.size();i++) {
66
+
67
+ klist.add(list.get(j));
68
+
69
+ }
70
+
71
+ ```
72
+
73
+
74
+
75
+ ```Java
76
+
77
+ List<K> list = (List<K>) entries[i];
78
+
79
+ klist.addAll(list);
80
+
81
+ ```
82
+
83
+
84
+
85
+ 次に質問文のコードは`LinkedList`なので、[`RandomAccess`](https://docs.oracle.com/javase/jp/9/docs/api/java/util/RandomAccess.html)ができません。
86
+
87
+ 内部は`ArrayList`で持つほうがよいでしょう。
88
+
89
+ ◇参考情報
90
+
91
+ [軽い気持ちでLinkedListを使ったら休出する羽目になった話](https://qiita.com/neko_machi/items/d620c4a8958e74df3550)
92
+
93
+
94
+
95
+ 最後にもっとパフォーマンスを気にするのであれば、`entries`とは別に`hashcode`値のみを管理するint配列(buckets)を宣言して`loadFactor`に応じて`rehash`してくださいな。
96
+
97
+
98
+
99
+ ◇参考になりそうな物
100
+
101
+ [.netのHashSetクラスのAddIfNotPresentをreferencesourceで見ると](https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Collections/Generic/HashSet.cs#L1044)
102
+
103
+ ※[referencesourceのソースコードライセンスはMITです。](https://github.com/Microsoft/referencesource)
104
+
105
+ > License
106
+
107
+ > The files in this repository are licensed with the MIT license unless otherwise specified in the file header.

1

追記

2018/08/06 07:22

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -7,3 +7,9 @@
7
7
 
8
8
 
9
9
  loadFactorもループでまわす部分は一緒ですが、LinkedList#size()を使って計算する部分が違います。
10
+
11
+
12
+
13
+ ◇余談
14
+
15
+ `HashTableEntry`の`Key`はインプレース変更を防止するために、インスタンス変数は`final`で宣言してくださいな。