Вопрос

Я хотел бы обернуть класс PriorityQueue Java в Clojure для использования в другой части моей программы.Я пытаюсь выяснить, есть ли какой-нибудь способ сделать это шепелявым образом и сделать приоритетную очередь неизменяемой.Есть ли хорошие способы сделать это, или мне просто лучше использовать PriorityQueue в качестве изменяемой структуры данных?

Это было полезно?

Решение

Я не думаю, что существует простой способ обернуть изменяемую структуру данных неизменяемой.Неизменяемые структуры данных становятся эффективными, когда новая версия может умным образом обмениваться данными со старой версией, и я не могу понять, как это можно сделать без доступа к внутренностям системы. PriorityQueue.

Если вам действительно нужна постоянная приоритетная очередь эта тема может быть интересно.Однако, похоже, у них есть вставки с линейным временем, поэтому, если это проблема, возможно, вам придется поискать другую реализацию.

Редактировать:Если подумать, простая реализация постоянной приоритетной очереди состоит в том, чтобы просто хранить пары (прио, значение) в отсортированном наборе.Что-то вроде этого:

(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)))

Конечно, приведенный выше код довольно ограничен (например, нет нескольких записей), но он иллюстрирует идею.

Другие советы

Вы не можете автоматически сделать изменяемый класс неизменяемым.Всегда можно напрямую вызвать класс Java и изменить его.

Чтобы обеспечить неизменность, вы можете либо реализовать это в Clojure, либо расширить класс Java и генерировать исключения во всех реализациях изменяемых методов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top