回答編集履歴
7
リンク先が違っていたので、修正!
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/
|
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
追記
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
追記
test
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
パフォーマンスを気にしないのであれば以下のように。
|
26
26
|
|
27
|
-
2重ループでまわす一番理解しやすいと思えるコードです。
|
27
|
+
2重ループでまわす一番理解しやすいと思えるコードです。(**未テストです**)
|
28
28
|
|
29
29
|
```Java
|
30
30
|
|
4
インクリメント演算子がまちがってたああああ
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();
|
39
|
+
for(int j=0;j < list.size();j++) {
|
40
40
|
|
41
41
|
klist.add(list.get(j));
|
42
42
|
|
3
追記
test
CHANGED
@@ -56,33 +56,27 @@
|
|
56
56
|
|
57
57
|
以下からはパフォーマンスを気にする人向けのコード。
|
58
58
|
|
59
|
-
[List#addAll](https://docs.oracle.com/javase/jp/
|
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
|
-
```
|
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`なので、[
|
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
追記
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
追記
test
CHANGED
@@ -7,3 +7,9 @@
|
|
7
7
|
|
8
8
|
|
9
9
|
loadFactorもループでまわす部分は一緒ですが、LinkedList#size()を使って計算する部分が違います。
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
◇余談
|
14
|
+
|
15
|
+
`HashTableEntry`の`Key`はインプレース変更を防止するために、インスタンス変数は`final`で宣言してくださいな。
|