質問編集履歴

4

最終的な解決策を記載

2023/06/18 08:06

投稿

genki
genki

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,19 +1,21 @@
1
1
  ### 実現したいこと
2
2
 
3
3
  PriorityQueueのremove(Object o)の計算量を落としたい。
4
- そのためにPackagePrivateになっている変数をリフレクションで取得したい。
4
+ ~~そのためにPackagePrivateになっている変数をリフレクションで取得したい。~~
5
+
6
+ 最終的にリフレクションを使うのはあきらめてTreeMapを利用して自作しました。
5
7
 
6
8
  ### 前提
7
9
 
8
- やりたいことは上記のとおりです。
10
+ ~~やりたいことは上記のとおりです。
9
11
  ソースを覗いたらremove(Object o)で使われているindexOf()が片っ端から配列の要素を見ているみたいなので、適切に二分探索するようにオーバーライドしたらいいのではと考えました。
10
- indexOf()の中で使われている変数(transient Object[] queue と int size)がPackagePrivateなので、これを取得して使えるようにしたいです。
12
+ indexOf()の中で使われている変数(transient Object[] queue と int size)がPackagePrivateなので、これを取得して使えるようにしたいです。~~
11
13
 
12
14
  ### 発生している問題・エラーメッセージ
13
15
 
14
- Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field transient java.lang.Object[] java.util.PriorityQueue.queue accessible: module java.base does not "opens java.util" to unnamed module @85ede7b
16
+ ~~Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make field transient java.lang.Object[] java.util.PriorityQueue.queue accessible: module java.base does not "opens java.util" to unnamed module @85ede7b~~
15
17
 
16
- 下記のソースではsetAccessible(true)の箇所でエラーが出ています。
18
+ ~~下記のソースではsetAccessible(true)の箇所でエラーが出ています。~~
17
19
 
18
20
  ### 該当のソースコード
19
21
 
@@ -90,9 +92,58 @@
90
92
 
91
93
  ### 試したこと
92
94
 
93
- 見様見真似で色々試しましたが、リフレクションの使い方を理解できていないのでエラーの内容がわかりません。
95
+ ~~見様見真似で色々試しましたが、リフレクションの使い方を理解できていないのでエラーの内容がわかりません。~~
94
96
 
95
97
  ### 補足情報(FW/ツールのバージョンなど)
96
98
 
97
- あくまでremove(Object o)の計算量を落とすことが目的なので、もしほかに実現できる方法があればそれでも構わないのでよろしくお願いします。
99
+ ~~あくまでremove(Object o)の計算量を落とすことが目的なので、もしほかに実現できる方法があればそれでも構わないのでよろしくお願いします。~~
100
+ TreeMapを利用してPriorityQueueもどきを自作しました。
101
+ ```Java
102
+ class MyPriorityQueue<K> {
103
+ TreeMap<K, Integer> map = new TreeMap<>();
98
104
 
105
+ public void add(K key) {
106
+ if (map.containsKey(key)) {
107
+ int value = map.get(key);
108
+ map.put(key, value + 1);
109
+ } else {
110
+ map.put(key, 1);
111
+ }
112
+ }
113
+
114
+ public boolean remove(K key) {
115
+ if (map.containsKey(key)) {
116
+ int value = map.get(key);
117
+ if (value == 1) {
118
+ map.remove(key);
119
+ } else {
120
+ map.put(key, value - 1);
121
+ }
122
+ return true;
123
+ } else {
124
+ return false;
125
+ }
126
+ }
127
+
128
+ public K poll() {
129
+ if (!map.isEmpty()) {
130
+ K fk = map.firstKey();
131
+ remove(fk);
132
+ return fk;
133
+ } else {
134
+ return null;
135
+ }
136
+ }
137
+
138
+ public K peek() {
139
+ if (!map.isEmpty()) {
140
+ return map.firstKey();
141
+ } else {
142
+ return null;
143
+ }
144
+ }
145
+ }
146
+
147
+ ```
148
+
149
+

3

ソースにマークダウン使用

2023/06/18 06:31

投稿

genki
genki

スコア14

test CHANGED
File without changes
test CHANGED
@@ -17,6 +17,7 @@
17
17
 
18
18
  ### 該当のソースコード
19
19
 
20
+ ```Java
20
21
  import java.lang.reflect.Field;
21
22
  import java.util.Comparator;
22
23
  import java.util.PriorityQueue;
@@ -85,6 +86,7 @@
85
86
  return -1;
86
87
  }
87
88
  }
89
+ ```
88
90
 
89
91
  ### 試したこと
90
92
 

2

タイトル修正

2023/06/17 23:49

投稿

genki
genki

スコア14

test CHANGED
@@ -1 +1 @@
1
- PriorityQueueのremove()の計算量を落としたい
1
+ PriorityQueueのremove(Object o)の計算量を落としたい
test CHANGED
File without changes

1

remove()からremove(Object o)に修正

2023/06/17 23:44

投稿

genki
genki

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,12 @@
1
1
  ### 実現したいこと
2
2
 
3
- PriorityQueueのremove()の計算量を落としたい。
3
+ PriorityQueueのremove(Object o)の計算量を落としたい。
4
4
  そのためにPackagePrivateになっている変数をリフレクションで取得したい。
5
5
 
6
6
  ### 前提
7
7
 
8
8
  やりたいことは上記のとおりです。
9
- ソースを覗いたらremove()で使われているindexOf()が片っ端から配列の要素を見ているみたいなので、適切に二分探索するようにオーバーライドしたらいいのではと考えました。
9
+ ソースを覗いたらremove(Object o)で使われているindexOf()が片っ端から配列の要素を見ているみたいなので、適切に二分探索するようにオーバーライドしたらいいのではと考えました。
10
10
  indexOf()の中で使われている変数(transient Object[] queue と int size)がPackagePrivateなので、これを取得して使えるようにしたいです。
11
11
 
12
12
  ### 発生している問題・エラーメッセージ
@@ -92,5 +92,5 @@
92
92
 
93
93
  ### 補足情報(FW/ツールのバージョンなど)
94
94
 
95
- あくまでremove()の計算量を落とすことが目的なので、もしほかに実現できる方法があればそれでも構わないのでよろしくお願いします。
95
+ あくまでremove(Object o)の計算量を落とすことが目的なので、もしほかに実現できる方法があればそれでも構わないのでよろしくお願いします。
96
96