Buna hızlı bir cevap bulamadığım için şaşkınım. Esasen Java'da java.util.List
arayüzü uygulayan , ancak üyelerini sıralı bir düzende depolayan bir veri yapısı arıyorum . Normal ArrayList
kullanabileceğinizi ve Collections.sort()
üzerinde kullanabileceğinizi biliyorum, ancak ara sıra listemden üyeler ekleyip sık sık geri çağırdığım bir senaryom var ve her üye aldığımda bunu sıralamak istemiyorum. yenisi eklendi. Birisi beni JDK'da veya hatta 3. parti kitaplıklarda var olan böyle bir şeye yönlendirebilir mi?
DÜZENLE : Veri yapısının kopyaları koruması gerekecek.
CEVAP ÖZETİ : Bütün bunları çok ilginç buldum ve çok şey öğrendim. Özellikle Aioobe, yukarıdaki gereksinimlerime ulaşma konusundaki kararlılığından bahsetmeyi hak ediyor (çoğunlukla kopyaları destekleyen sıralı bir java.util.List uygulaması). Onun cevabını, sorduğum şey için en doğru olarak kabul ettim ve sorduğum şey tam olarak ihtiyacım olan şey olmasa bile aradığım şeyin sonuçlarını kışkırtır.
İstediğim şeyle ilgili problem Liste arayüzünün kendisinde ve bir arayüzdeki isteğe bağlı yöntemler konseptinde yatıyor. Javadoc'tan alıntı yapmak için:
Bu arayüzün kullanıcısı, her bir elemanın listenin neresine eklendiği konusunda kesin kontrole sahiptir.
Sıralanmış bir listeye ekleme, ekleme noktası üzerinde kesin kontrole sahip değildir. Ardından, bazı yöntemleri nasıl kullanacağınızı düşünmelisiniz. add
Örneğin alın :
genel boolean ekleme (Nesne o)
Appends the specified element to the end of this list (optional operation).
Artık her ikisinin de rahatsız edici durumda kaldınız: 1) Sözleşmeyi add
bozmak ve toplama işleminin sıralı bir sürümünü uygulamak 2) Listenin sonuna bir öğe eklemek, sıralı sıranızı bozmak 3) Atarak add
(isteğe bağlı olarak) dışarı çıkmak bir UnsupportedOperationException
ve sıralı bir sırayla öğeleri ekleyen başka bir yöntemi uygulamak.
Seçenek 3 muhtemelen en iyisidir, ancak kullanamayacağınız bir ekleme yöntemine ve arayüzde olmayan başka bir sıralı Ekleme yöntemine sahip olmayı tatsız buluyorum.
Diğer ilgili çözümler (belirli bir sıra olmadan):
- java.util.PriorityQueue , muhtemelen ihtiyacım olana istediğimden daha yakın. Bir kuyruk, benim durumumda bir nesne koleksiyonunun en kesin tanımı değildir, ancak işlevsel olarak ihtiyacım olan her şeyi yapar.
- net.sourceforge.nite.util.SortedList . Bununla birlikte, bu uygulama,
add(Object obj)
yöntemdeki sıralamayı uygulayarak Liste arayüzünün sözleşmesini bozar ve tuhaf bir şekilde bunun için hiçbir etkisi yokturadd(int index, Object obj)
. Genel fikir birliği,throw new UnsupportedOperationException()
bu senaryoda daha iyi bir seçim olabileceğini öne sürüyor . - Guava'nın TreeMultiSet'i Yinelemeleri destekleyen bir set uygulaması
- ca.odell.glazedlists.SortedList Bu sınıf, javadoc'unda uyarı ile birlikte gelir:
Warning: This class breaks the contract required by List