Sıralanmış dizi Java listesi
Bu hızlı bir cevap bulamıyorum buna çok şaşırdım. Aslında java.util.List
arabirim uygulayan, sıralı bir şekilde kendi üyeleri saklayan Java bir datastructure arıyorum. Biliyorum kullanabileceğiniz bir normal ArrayList
Collections.sort()
, ama ben bir senaryo Neredeyim zaman zaman ekleme ve sık sık alınıyor üyelerinden listemi görmek de istemiyorum için sıralama her zaman almak Bir üye diye yeni bir tane eklenmiştir. Herkes hangi FIRSATLAR var böyle bir şey, hatta 3. parti kütüphaneleri doğru beni işaret edebilir?
EDİT: Datastructure çiftleri korumak gerekir.
CEVAP ÖZETİBu çok ilgi çekici buldum ve çok şey öğrendim. Özellikle Aioobe (ağırlıklı olarak sıralanmış bir java.yukarıdaki benim gereksinimleri ulaşmak için onun azim için anılmayı hak ediyor açıklama.Çiftleri destekleyen liste uygulaması). Sorduğum için en doğru olarak cevabı kabul ettim ve çoğu istediğim şeyi tam olarak ihtiyacım olmasa bile arıyordum ne etkileri üzerinde düşündürücü.
Liste yatıyor arayüzü için kendisine sordum ve bir arabirim isteğe bağlı yöntemleri kavramı ile sorun. Bu javadoc alıntı:
Bu kullanıcı arabiriminin listedeki her öğe takıldığı üzerinde tam kontrole sahip.
Sıralanmış bir listesine ekleme ekleme noktası üzerinde tam kontrolü yok. Sonra, bu yöntemlerden bazıları ele nasıl düşünmek zorunda. Örneğin add
:
public boolean add(Object o)
Appends the specified element to the end of this list (optional operation).
Şimdi de rahatsız bir durumda bırakılır
1) sözleşme zorla sıralanmış bir sürüm uygulama Ekle
2) add
İzin listenin sonuna bir eleman, sıralanmış sipariş kırılma Ekle
3) UnsupportedOperationException
atma ve başka bir yöntemi uygulayarak add
(isteğe bağlı olarak) Terk sıralı bir şekilde öğeleri ekler.
Seçenek 3 muhtemelen en iyisidir, ama bir kullanamazsın yöntemi ekleyin ve arayüzü değil başka bir sortedAdd yöntem olan çirkin buluyorum.
Diğer ilgili çözümleri (özel bir sırada):
- Muhtemelen istediğim şeyi daha ihtiyacım olan şey en yakın olan java.util.PriorityQueue. Sıra benim durumumda nesnelerin bir koleksiyonu en doğru tanım değil, ama işlevsel olarak bunun için gereken her şeyi yapar.
- net.sourceforge.nite.util.SortedList. Ancak bu uygulama
add(Object obj)
yöntemi uygulayarak sıralama Listesi arayüzü sözleşmesi sonları ve acayip bir şekildeadd(int index, Object obj)
için geçerli bir yöntem vardır. Genel kanı;throw new UnsupportedOperationException()
Bu senaryoda daha iyi bir seçenek olabileceğini gösteriyor. - Guava's TreeMultiSet yineleme destekleyen Bir dizi uygulama
- Kendi javadoc Bu sınıf ihtar ile gelir ca.odell.glazedlists.SortedList:
Warning: This class breaks the contract required by List
CEVAP
Minimalist Çözüm
Burada bir "" çözüm. az
class SortedArrayList<T> extends ArrayList<T> {
@SuppressWarnings("unchecked")
public void insertSorted(T value) {
add(value);
Comparable<T> cmp = (Comparable<T>) value;
for (int i = size()-1; i > 0 && cmp.compareTo(get(i-1)) < 0; i--)
Collections.swap(this, i, i-1);
}
}
Ekle doğrusal zamanda çalışır, ama bir ArrayList neyse (eklenen öğenin sağındaki tüm unsurları bir şekilde kaymış olması gerekir) kullanarak daha düşük olurdu.
Olmayan-benzer bir şey ekleme ClassCastException sonuçları. (Bu yaklaşım da PriorityQueue
tarafından alınmıştır:Öncelik sıra doğal sipariş güvenerek de olmayan karşılaştırılabilir nesneler ekleme (bunu yaparken ClassCastException neden olabilir) izin vermez.)
List.add
geçersiz kılma
Sıralı bir şekilde ekleme elemanları List.add
(ya da bu konuda 35**) geçersiz olacağını unutmayınarabirim belirtimi doğrudan ihlali. Sana neolabiliryapmak, UnsupportedOperationException
atmak için bu yöntemi geçersiz kılar.
List.add
: docs
boolean add(E e)
< / ^ br . Ekler bu listenin sonuna belirtilen öğe (isteğe bağlı operasyonu).
Aynı mantık* *24, addAll
Her iki sürümü ve set
Her iki sürümü için de geçerlidir. (Tüm liste arayüz göre işlemleri isteğe bağlıdır.)
Bazı testler
SortedArrayList<String> test = new SortedArrayList<String>();
test.insertSorted("ddd"); System.out.println(test);
test.insertSorted("aaa"); System.out.println(test);
test.insertSorted("ccc"); System.out.println(test);
test.insertSorted("bbb"); System.out.println(test);
test.insertSorted("eee"); System.out.println(test);
....baskı:
[ddd]
[aaa, ddd]
[aaa, ccc, ddd]
[aaa, bbb, ccc, ddd]
[aaa, bbb, ccc, ddd, eee]
Java dizi listesi dönüştürmek...
Neden sıralanmamış bir dizi daha hızlı...
Dizi Java mı ilan edeceğiz?...
Nasıl Java iki dizi bir arada olabilir...
Ne'un yazdırmak için en kolay yol...