2013-03-25 21 views
15

Nie mogę zrozumieć, dlaczego JCF (Java Collection Framework) nie ma implementacji Bag (aby umożliwić duplikaty i nie utrzymywać porządku). Wydajność torby byłaby znacznie lepsza niż obecne wdrożenia kolekcji w JCF.Dlaczego nie ma bezpośredniej implementacji worka w strukturze zbioru java?

  • Wiem, jak zaimplementować torebkę w języku Java.
  • Wiem, że istnieje kolekcja torebek w Apache wspólne.
  • Wiem, że mogę wykorzystać każdą implementację jako torbę! ale w innych wdrożeniach jest tak wiele pracy, jak w przypadku Bag.

Dlaczego struktura kolekcji Java nie zawiera bezpośrednich implementacji takich jak ta?

+0

[To] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6567419) może być warte patrząc na –

Odpowiedz

11

Zamieszczam mój komentarz jako odpowiedź, ponieważ najlepiej odpowiada na to pytanie.

Z raportu o błędzie złożony here:

Nie ma wiele entuzjazmu wśród opiekunów ram Collection zaprojektowanie i wdrożenie tych interfejsów/klas. Ja osobiście nie pamiętam, że go potrzebowałem. Byłoby bardziej prawdopodobne, że popularny pakiet opracowany poza JDK zostanie zaimportowany do JDK po tym, jak udowodnił swoją wartość w realnym świecie.

Potrzeba posiadania wsparcia dla Torby jest dziś ważna.

Guava ma wsparcie dla tego. Również GS-Collections.

+2

Po prostu miałem potrzebę użycia torby, kiedy musiałem wygenerować mieszankę kolekcji, sortowanie desconsidering, ale biorąc pod uwagę powtarzające się itens. List.hashcode() uwzględnia kolejność elementów. Set.hashset() może poprawnie zdyskontować zamówienie, ale także odrzuci powtarzające się elementy. Jedynym poprawnym hashcode() impl w tym przypadku, może być implementacja Bag. To była kanoniczna sygnatura JSON. – DLopes

-1

JDK stara się wdrożyć wspólne struktury danych i umożliwić wdrożenie czegokolwiek, jeśli wspólne struktury nie będą serwerować twojego celu. Mogli sądzić, że nie jest to powszechna struktura danych. Z praktycznego punktu widzenia nie jest możliwe, aby zaimplementowali każdą strukturę danych lub spełnili wymagania wszystkich. To, co myślisz, może nie być powszechne dla większości.

+0

Bag jest bardzo powszechne w obszarze zbierania! widzę wiele razy ludzie używają Innej realizacji kolekcji zamiast torby.tylko dlatego, że nie ma żadnej bezpośredniej implementacji torby w JCF, więc muszą płacić dodatkowe koszty innych zbiorów. i Believe Bag to najczęstsza kolekcja. –

+0

"Torba jest bardzo popularna w obszarze zbierania". To znowu Twoje doświadczenie. Przez moją karierę muszę używać Bag/Multiset tylko raz. Myślę, że to zależy od tego, co pracujesz. – Adi

+0

Link do problemu dostarczony przez Ajay George może odpowiedzieć na twoje pytanie. – Adi

3

Obecnie worek narusza umowę o zbiorach. Wiele metod jest w konflikcie z obecnymi regułami kolekcji.

„Bag to zbiór, który zlicza liczbę razy obiekt pojawia się w kolekcji. Załóżmy, że masz worek zawierający {a, a, b, c}. Wywołanie getCount(Object) na a wróci 2, podczas wywoływania uniqueSet() wróci {a, b, c}.

Należy zauważyć, że interfejs ten narusza umowę kolekcji, zachowanie określone w wielu z tych metod nie jest takie samo, jak zachowanie określone w Kolekcji, a niezgodne metody są wyraźnie oznaczone w linii podsumowania słowem "(naruszenie)". class określi takie samo zachowanie jak Collection, co niestety złamie wstecz kompatybilność z tą wersją. "

boolean add(java.lang.Object o) 
     (Violation) Add the given object to the bag and keep a count. 

boolean removeAll(java.util.Collection c) 
     (Violation) Remove all elements represented in the given collection, respecting cardinality. 

proszę zobaczyć link Więcej informacji: HERE

+1

Dołącz tekst tutaj z linku. – deW1

+2

jaka jest umowa o zbiór? –

+0

Ta część cytowanej dokumentacji nie stanowi naruszenia. –

Powiązane problemy