私のプログラムの別の部分で使用するために、javaのPriorityQueueクラスをclojureでラップしたいと思います。私が理解しようとしているのは、これを淡々として行い、優先順位キューを不変にする方法があるかどうかです。これを行うには良い方法はありますか、あるいは私はただ変更可能なデータ構造としてPriorityQueueを使う方が良いでしょうか?ClojureでJavaクラスを不変にするにはどうすればよいですか?
7
A
答えて
8
変更可能なデータ構造を不変のものとして包む簡単な方法はないと思います。不変なデータ構造は、新しいバージョンが旧バージョンと賢明にデータを共有できるときに効率的になります。PriorityQueue
の内部へのアクセスなしにこれがどのように行われるかは実際にはわかりません。
永続的優先度キューthis threadが本当に必要な場合は面白いかもしれません。それらは線形時間の挿入を持っているようですが、それが問題であれば別の実装を探す必要があるかもしれません。
編集:第2の考えでは、永続的優先度キューの簡単な実装は、(prio、value)のペアをソートされたセットに格納することです。
(defn make-pqueue []
(sorted-set))
(defn pqueue-add [pq x prio]
(conj pq [prio x]))
(defn pqueue-peek [pq]
(first pq))
(defn pqueue-pop [pq]
(let [top (first pq)]
(disj pq top)))
もちろん、上記のコードはかなり制限されています(例:複数のエントリはありません)が、そのアイデアを示しています。
7
自動的に変更可能なクラスを不変にすることはできません。 Javaクラスを直接呼び出して変更することができます。
不変性を強制するには、それをclojureで実装するか、javaクラスを拡張して、すべての変更可能なメソッド実装で例外をスローすることができます。
関連する問題
- 1. このJavaの例を慣用的なClojureに変換するにはどうすればよいですか?
- 2. Clojureでマクロをマップするにはどうすればよいですか?
- 3. Clojureでコールスタックを取得するにはどうすればよいですか?
- 4. ClojureでZipを使用するにはどうすればよいですか?
- 5. (Android)アプリケーションコンテキストをJavaクラスに渡すにはどうすればよいですか?
- 6. Clojureのfnで未定義シンボルを使用するにはどうすればよいですか? Clojureので
- 7. 抽象的な不変クラスを作成するにはどうすればよいですか?
- 8. Clojureで "defn"マクロを書くにはどうすればよいですか?
- 9. 「def」をclojureにリロードしないようにするにはどうすればよいですか?
- 10. Java Eclipse - クラスパスを変更するにはどうすればよいですか?
- 11. クラスはどのようにセットアップすればよいですか?
- 12. Javaの抽象クラスからプライベートフィールドを変更するにはどうすればよいですか?
- 13. Clojureでタイプ変換を実行するにはどうすればよいですか?
- 14. 変更をClojureツリーのサブセット(ハッシュマップ)で確認するにはどうすればよいですか?
- 15. 文字のLazySeqをClojureの文字列に変換するにはどうすればよいですか?
- 16. Clojureで余分な間接を使わずに循環(および不変)データ構造を作成するにはどうすればよいですか?
- 17. Javaで長い変数をタイムスタンプに変更するにはどうすればよいですか?
- 18. 元のJavaクラスのソースを変更するにはどうすればよいですか?
- 19. は、どのようにJavaで不変シングルトンを作るには?
- 20. Actionscriptで "WindowedApplication"クラスにアクセスするにはどうすればよいですか?
- 21. Clojureでは、どのようにJavaクラスを動的に使用するのですか?
- 22. Clojureでcondpを書くにはどうすればいいですか?
- 23. PHPでクラス名を取得するにはどうすればよいですか? Javaでは
- 24. jqueryからjavaクラスに変数値を渡すにはどうすればいいですか?
- 25. PHPでクラスを参照するにはどうすればよいですか?
- 26. CythonでC++クラスをラップするにはどうすればよいですか?
- 27. Foldableクラスをモジュールにインポートするにはどうすればよいですか?
- 28. AndroidスマートフォンからリモートサーバーにあるJavaクラスを起動するにはどうすればよいですか?
- 29. freemarkerでネイティブjavaにアクセスするにはどうすればよいですか?
- 30. Kotlin派生クラスでオーバーライドするJavaオーバーロードを選択するにはどうすればよいですか?
ソートセットは、(prio、value)のペアでどのようにprioでソートすることがわかりますか? –
Clojureは辞書編集法でベクトルを比較するため、最初に優先度でソートし、次に値でソートします。 – CAdaker
実際には、ソースを見ると、同じ長さのベクトルだけが辞書順に比較されます。しかし、これは問題ではない。 – CAdaker