回答編集履歴
7
リンク先が違っていたので、修正!
answer
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
```
|
28
28
|
|
29
29
|
以下からはパフォーマンスを気にする人向けのコード。
|
30
|
-
[List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/
|
30
|
+
[java.util.List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/List.html#addAll-int-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
|
31
31
|
※最初の回答もそうですが、`Shallow Copy`な点に注意
|
32
32
|
```diff
|
33
33
|
List<K> list = (List<K>) entries[i];
|
6
追記
answer
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
> どうすればすべて取り出せるでしょうか
|
12
12
|
|
13
13
|
パフォーマンスを気にしないのであれば以下のように。
|
14
|
-
2重ループでまわす
|
14
|
+
2重ループでまわすコードです。(**未テストです**)
|
15
15
|
```Java
|
16
16
|
public List<K> keys() {
|
17
17
|
List<K> klist = new LinkedList<K>();
|
@@ -28,7 +28,7 @@
|
|
28
28
|
|
29
29
|
以下からはパフォーマンスを気にする人向けのコード。
|
30
30
|
[List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/Collection.html#addAll-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
|
31
|
-
※`Shallow Copy`な点に注意
|
31
|
+
※最初の回答もそうですが、`Shallow Copy`な点に注意
|
32
32
|
```diff
|
33
33
|
List<K> list = (List<K>) entries[i];
|
34
34
|
- for(int j=0;j < list.size();i++) {
|
5
追記
answer
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
> どうすればすべて取り出せるでしょうか
|
12
12
|
|
13
13
|
パフォーマンスを気にしないのであれば以下のように。
|
14
|
-
2重ループでまわす一番理解しやすいと思えるコードです。
|
14
|
+
2重ループでまわす一番理解しやすいと思えるコードです。(**未テストです**)
|
15
15
|
```Java
|
16
16
|
public List<K> keys() {
|
17
17
|
List<K> klist = new LinkedList<K>();
|
4
インクリメント演算子がまちがってたああああ
answer
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
List<K> klist = new LinkedList<K>();
|
18
18
|
for (int i = 0; i < this.entries.length; i++) {
|
19
19
|
List<K> list = (List<K>) entries[i];
|
20
|
-
for(int j=0;j < list.size();
|
20
|
+
for(int j=0;j < list.size();j++) {
|
21
21
|
klist.add(list.get(j));
|
22
22
|
}
|
23
23
|
}
|
3
追記
answer
CHANGED
@@ -27,25 +27,24 @@
|
|
27
27
|
```
|
28
28
|
|
29
29
|
以下からはパフォーマンスを気にする人向けのコード。
|
30
|
-
[List#addAll](https://docs.oracle.com/javase/jp/
|
30
|
+
[List#addAll](https://docs.oracle.com/javase/jp/9/docs/api/java/util/Collection.html#addAll-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
|
31
|
+
※`Shallow Copy`な点に注意
|
31
|
-
```
|
32
|
+
```diff
|
32
33
|
List<K> list = (List<K>) entries[i];
|
33
|
-
for(int j=0;j < list.size();i++) {
|
34
|
+
- for(int j=0;j < list.size();i++) {
|
34
|
-
klist.add(list.get(j));
|
35
|
+
- klist.add(list.get(j));
|
35
|
-
}
|
36
|
+
- }
|
37
|
+
+ klist.addAll(list);
|
36
38
|
```
|
37
39
|
|
38
|
-
```Java
|
39
|
-
List<K> list = (List<K>) entries[i];
|
40
|
-
klist.addAll(list);
|
41
|
-
```
|
42
|
-
|
43
|
-
次に質問文のコードは`LinkedList`なので、[
|
40
|
+
次に質問文のコードは`LinkedList`なので、[RandomAccess](https://docs.oracle.com/javase/jp/9/docs/api/java/util/RandomAccess.html)ができません。
|
44
41
|
内部は`ArrayList`で持つほうがよいでしょう。
|
45
42
|
◇参考情報
|
46
43
|
[軽い気持ちでLinkedListを使ったら休出する羽目になった話](https://qiita.com/neko_machi/items/d620c4a8958e74df3550)
|
47
44
|
|
48
|
-
最後にもっとパフォーマンスを気にするのであれば、`entries`とは別に`hashcode`値のみを管理するint配列(buckets)を宣言して`loadFactor`に応じて`rehash`してくださいな。
|
45
|
+
最後にもっとパフォーマンスを気にするのであれば、`entries`とは別に`hashcode`値のみを管理するint配列(`buckets`)を宣言して`loadFactor`に応じて`rehash`してくださいな。
|
46
|
+
あと多分スルーされたと思いますが、**キーのインプレース変更も防止**してくださいな。
|
47
|
+
個人的にライブラリの`HashMap`を使わずに`HashTable`を再実装される方の義務だと思っているので・・・
|
49
48
|
|
50
49
|
◇参考になりそうな物
|
51
50
|
[.netのHashSetクラスのAddIfNotPresentをreferencesourceで見ると](https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Collections/Generic/HashSet.cs#L1044)
|
2
追記
answer
CHANGED
@@ -5,4 +5,50 @@
|
|
5
5
|
loadFactorもループでまわす部分は一緒ですが、LinkedList#size()を使って計算する部分が違います。
|
6
6
|
|
7
7
|
◇余談
|
8
|
-
`HashTableEntry`の`Key`はインプレース変更を防止するために、インスタンス変数は`final`で宣言してくださいな。
|
8
|
+
`HashTableEntry`の`Key`はインプレース変更を防止するために、インスタンス変数は`final`で宣言してくださいな。
|
9
|
+
|
10
|
+
---
|
11
|
+
> どうすればすべて取り出せるでしょうか
|
12
|
+
|
13
|
+
パフォーマンスを気にしないのであれば以下のように。
|
14
|
+
2重ループでまわす一番理解しやすいと思えるコードです。
|
15
|
+
```Java
|
16
|
+
public List<K> keys() {
|
17
|
+
List<K> klist = new LinkedList<K>();
|
18
|
+
for (int i = 0; i < this.entries.length; i++) {
|
19
|
+
List<K> list = (List<K>) entries[i];
|
20
|
+
for(int j=0;j < list.size();i++) {
|
21
|
+
klist.add(list.get(j));
|
22
|
+
}
|
23
|
+
}
|
24
|
+
return klist;
|
25
|
+
}
|
26
|
+
|
27
|
+
```
|
28
|
+
|
29
|
+
以下からはパフォーマンスを気にする人向けのコード。
|
30
|
+
[List#addAll](https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#addAll-java.util.Collection-)を使うと、コレクションの要素をコピーできます。
|
31
|
+
```Java
|
32
|
+
List<K> list = (List<K>) entries[i];
|
33
|
+
for(int j=0;j < list.size();i++) {
|
34
|
+
klist.add(list.get(j));
|
35
|
+
}
|
36
|
+
```
|
37
|
+
|
38
|
+
```Java
|
39
|
+
List<K> list = (List<K>) entries[i];
|
40
|
+
klist.addAll(list);
|
41
|
+
```
|
42
|
+
|
43
|
+
次に質問文のコードは`LinkedList`なので、[`RandomAccess`](https://docs.oracle.com/javase/jp/9/docs/api/java/util/RandomAccess.html)ができません。
|
44
|
+
内部は`ArrayList`で持つほうがよいでしょう。
|
45
|
+
◇参考情報
|
46
|
+
[軽い気持ちでLinkedListを使ったら休出する羽目になった話](https://qiita.com/neko_machi/items/d620c4a8958e74df3550)
|
47
|
+
|
48
|
+
最後にもっとパフォーマンスを気にするのであれば、`entries`とは別に`hashcode`値のみを管理するint配列(buckets)を宣言して`loadFactor`に応じて`rehash`してくださいな。
|
49
|
+
|
50
|
+
◇参考になりそうな物
|
51
|
+
[.netのHashSetクラスのAddIfNotPresentをreferencesourceで見ると](https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Collections/Generic/HashSet.cs#L1044)
|
52
|
+
※[referencesourceのソースコードライセンスはMITです。](https://github.com/Microsoft/referencesource)
|
53
|
+
> License
|
54
|
+
> The files in this repository are licensed with the MIT license unless otherwise specified in the file header.
|
1
追記
answer
CHANGED
@@ -2,4 +2,7 @@
|
|
2
2
|
|
3
3
|
拡張for文でHashTable#entriesを回して、回した要素のLinkedListをループでたどればいいのでは。
|
4
4
|
|
5
|
-
loadFactorもループでまわす部分は一緒ですが、LinkedList#size()を使って計算する部分が違います。
|
5
|
+
loadFactorもループでまわす部分は一緒ですが、LinkedList#size()を使って計算する部分が違います。
|
6
|
+
|
7
|
+
◇余談
|
8
|
+
`HashTableEntry`の`Key`はインプレース変更を防止するために、インスタンス変数は`final`で宣言してくださいな。
|