Chciałbym zawinąć klasy PriorityQueue java w clojure do użytku w innej części mojego programu. Próbuję dowiedzieć się, czy istnieje sposób, aby zrobić to w sposób lispy i uczynić kolejkę priorytetową niezmienną. Czy są jakieś dobre sposoby, aby to zrobić, czy też po prostu lepiej będzie używać PriorityQueue jako zmiennej struktury danych?Jak ustawić niezmienną klasę Java w Clojure?
Odpowiedz
Nie sądzę, że istnieje prosty sposób na zawijanie zmiennej struktury danych jako niezmiennej. Niezmienne struktury danych stają się wydajne, gdy nowa wersja może współużytkować dane ze starszą wersją w sprytny sposób i nie mogę naprawdę zobaczyć, jak można to zrobić bez dostępu do elementów wewnętrznych z PriorityQueue
.
Jeśli naprawdę chcesz, aby stała kolejka priorytetowa this thread była interesująca. Wydaje się, że te wstawki mają liniowy czas, więc jeśli jest to problem, być może trzeba poszukać innej implementacji.
Edycja: Po chwili namysłu, prosta implementacja kolejki priorytetowej jest po prostu do przechowywania (prio, wartość) -para w posortowanym zestawie. Coś takiego:
(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)))
Oczywiście powyższy kod jest dość ograniczony (na przykład brak wielu wpisów), ale ilustruje ten pomysł.
Nie można zautomatyzować modyfikacji klasy niezmiennej. Zawsze można bezpośrednio wywołać klasę Java i zmutować ją.
Aby wymusić niezmienność, można ją zaimplementować w clojure lub rozszerzyć klasę java i zgłaszać wyjątki we wszystkich implementacjach metod zmiennych.
- 1. Jak mogę rzucić klasę Java w Clojure?
- 2. Ustaw klasę Java jako sekwencję w Clojure
- 3. Jak odwzorować klasę jako niezmienną za pomocą FluentNHibernate?
- 4. Sprawdź klasę czegoś w clojure?
- 5. Efektywnie "modyfikując" niezmienną mapę
- 6. Jak ustawić główną klasę w kompilacji?
- 7. Warunkowo ustawić klasę CSS
- 8. Czy istnieje biblioteka .net z trwałą niezmienną klasą wektorów (jak w Clojure/Scala)?
- 9. Jak programowo importować klasę Java
- 10. Java: jak "zrestartować" klasę statyczną?
- 11. Jak przechodzić przez niezmienną listę jak forEach?
- 12. Jak uzyskać klasę int. Java w Scali?
- 13. Jak ustawić typową metodę Java?
- 14. Jak deserializować niezmienną kolekcję za pomocą Kryo?
- 15. Generics Java - zdobyć klasę?
- 16. Java: Konwertuj prymitywną klasę
- 17. Java Interop - Netty + Clojure
- 18. JSON na klasę Java
- 19. Dlaczego mamy niezmienną pustą mapę?
- 20. jak ustawić przesunięcie w oparciu o bieżącą klasę selekcji
- 21. Jak ustawić ustawienia aplikacji w czasie instalacji (przez klasę instalatora)?
- 22. jak ustawić główną klasę w projekcie SBT 0.13
- 23. Jak wywołać klasę Java z jmetera?
- 24. Dostęp do pól Java dynamicznie w Clojure?
- 25. Jak hermetyzować w clojure?
- 26. Rozszerzanie klasy Java Swing w Clojure
- 27. Importowanie klas Java do Clojure
- 28. Clojure zero vs Java null?
- 29. Osadzanie programu swank-clojure w programie java
- 30. Aliasing nazwy pakietu java w clojure
W jaki sposób sortowany zestaw jest znany z sortowania według priorytetu w parze (prio, value)? –
Clojure porównuje wektory leksykograficznie, więc najpierw sortuje według priorytetu, a druga według wartości. – CAdaker
W rzeczywistości, patrząc na źródło, tylko wektory o równej długości są porównywane leksykograficznie. Ale to nie jest problem w tym przypadku. – CAdaker