teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

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

2018/08/06 08:40

投稿

umyu
umyu

スコア5846

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/Collection.html#addAll-java.util.Collection-)を使うと、コレクションの要素をShallow Copy(※)できます。
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

追記

2018/08/06 08:40

投稿

umyu
umyu

スコア5846

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

追記

2018/08/06 08:12

投稿

umyu
umyu

スコア5846

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

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

2018/08/06 07:36

投稿

umyu
umyu

スコア5846

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();i++) {
20
+ for(int j=0;j < list.size();j++) {
21
21
  klist.add(list.get(j));
22
22
  }
23
23
  }

3

追記

2018/08/06 07:35

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -27,25 +27,24 @@
27
27
  ```
28
28
 
29
29
  以下からはパフォーマンスを気にする人向けのコード。
30
- [List#addAll](https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#addAll-java.util.Collection-)を使うと、コレクションの要素をコピーできます。
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
- ```Java
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`なので、[`RandomAccess`](https://docs.oracle.com/javase/jp/9/docs/api/java/util/RandomAccess.html)ができません。
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

追記

2018/08/06 07:32

投稿

umyu
umyu

スコア5846

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

追記

2018/08/06 07:22

投稿

umyu
umyu

スコア5846

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`で宣言してくださいな。