SORU
27 EKİM 2010, ÇARŞAMBA


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 şekilde add(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
27 EKİM 2010, ÇARŞAMBA


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]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Noam Erez

    Noam Erez

    3 NİSAN 2012
  • pissengehen

    pissengehen

    26 EYLÜL 2006
  • Top Gear

    Top Gear

    27 Mart 2006