SORU
4 Ocak 2012, ÇARŞAMBA


Neden Java ile hiç bir SortedList var mı?

Java SortedSet SortedMap arabirimleri vardır. Hem standart Java Koleksiyonları çerçeve aittir ve elemanları erişmek için sıralanmış bir yol sağlar.

Ancak, benim anlayış Java SortedList yoktur. java.util.Collections.sort() bir listeyi sıralamak için kullanabilirsiniz.

Bu şekilde tasarlanmıştır neden herhangi bir fikir?

CEVAP
4 Ocak 2012, ÇARŞAMBA


Liste kullanımına listesi iç sipariş (aka. olarak listenin öğelerini olsun öncelikle teminatekleme sırası). Daha spesifik olarak liste değiştirdin nasıl öğeleri ekledikten sırada ya. Sıralama veri yapısı bir manipülasyon olarak görülebilir, ve sıralamak için çeşitli yollar vardır.

Sırası ile yollarını sipariş edeceğimkullanışlılıkben şahsen gördüğünüz gibi:

1. Set Bag koleksiyonlar yerine kullanmayı düşünün

NOT:Bu normalde zaten yapmak istediğin şey nedir zirvede çünkü bu seçenek koydum.

Sıralanmış bir diziotomatik olarak sıralar ekleme koleksiyonukoleksiyon öğeleri ekledikten olsa sıralama bu mu yani. Bunu el ile de bir bakıma gerek yok demektir.

Eğer hakkında endişelenmenize gerek yok emin iseniz (veya) yinelenen öğeleri TreeSet<T> yerine kullanabilirsiniz ayrıca. SortedSet NavigableSet muhtemelen bir listesi beklediğiniz gibi arabirimleri ve işleri gerçekleştirir:

TreeSet<String> set = new TreeSet<String>();
set.add("lol");
set.add("cat");
// automatically sorts natural order when adding

for (String s : set) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

Eğer doğal sipariş istemesen bile Comparator<T> götüren yapıcı parametre kullanabilirsiniz.

Alternatif olarak kullanabilirsinizMultisets (de bilinirÇanta)bu yinelenen öğeleri sağlar Set bir, yerine ve üçüncü parti uygulamalar vardır. En önemlisi Guava libraries bir çok TreeSet gibi çalışır TreeMultiset.

2. Collections.sort() ile sıralamak

Yukarıda da belirttiğimiz gibi, Lists sıralama veri yapısı bir manipülasyon. "Bu yol daha sonra el ile gitmek yoludur. çeşitli sıralama olarak sıralanır "gerçek kaynağı gereken durumlar için yani

java.util.Collections.sort() yöntemi ile sıralayabilirsiniz. Burada nasıl bir kod örneği:

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

Collections.sort(strings);
for (String s : strings) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

Karşılaştırıcı kullanarak

Net bir fayda sort yöntemi Comparator kullanabilirsiniz. Java da yerel ayar duyarlı sıralama dizeleri için yararlı olan Collator gibi Comparator için bazı uygulamaları sağlar. İşte bir örnek:

Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY); // ignores casing

Collections.sort(strings, usCollator);

Eşzamanlı ortamlarda sıralama

sort yöntemi kullanarak toplama örneği manipüle olacağından eşzamanlı ortamlarda dostu değildir, ama unutmayın, bunun yerine değişmez koleksiyonları ile göz önünde bulundurmalısınız. Bu Guava Ordering sınıfta sağlar ve oyunu basit bir şey

List<string> sorted = Ordering.natural().sortedCopy(strings);

3. java.util.PriorityQueue ile listenizi sarın

Java'da sıralama listesi yok ancak muhtemelen bu sizin için iyi çalışacak hangi sıralanmış bir sıra var. java.util.PriorityQueue sınıfı.

Nico Haase de bu cevapları related question bir yorum bağlandı.

Sıralanmış bir koleksiyonbüyük olasılıkla işlemek istemiyorumPriorityQueue sağlamayan neden olan bir iç veri yapısı Liste arabirimi sen öğelerine doğrudan erişim imkanı verecektir çünkü).

PriorityQueue yineleyici üzerinde uyarı

PriorityQueue sınıfı her zamanki gibi yinelenen olabilir Iterable<E> Collection<E> arayüzler uygular. Ancak yineleyici sıralanmış sırayla öğeleri iade garantisi yoktur. Alderath yorum olarak işaret ettiği gibi () 34* *gerek sıraya kadar boş yerine.

constructor that takes any collection): öncelik sırası için bir liste dönüştürebilirsiniz unutmayın

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

PriorityQueue<String> sortedStrings = new PriorityQueue(strings);
while(!sortedStrings.isEmpty()) {
    System.out.println(sortedStrings.poll());
}
// Prints out "cat" and "lol"

4. ** 36 kendi sınıf yazmak

NOT:Bunu yapman gerekmiyor.

Kendi listenizde o sıralar yeni bir öğe eklemek her zaman sınıf yazabilirsiniz. Bu hesaplama oldukça ağır uygulamanız bağlı olarak alabilirve anlamsızdıriki ana sebep yüzünden bir egzersiz gibi, bunu yapmak istemiyorsan:,

  1. add yöntemleri öğesi, kullanıcının belirlediği endeks içinde kalacak emin olmalıdır çünkü List<E> arabirimi olan sözleşme kırar.
  2. Neden tekerleği yeniden icat? TreeSet veya Multisets yerine ilk noktada yukarıda işaret olmalıdır.

Ancak eğer burada başlamak için bir kod örneği bir egzersiz yapmak istiyorsanız, AbstractList soyut sınıfını kullanır:

public class SortedList<E> extends AbstractList<E> {

    private ArrayList<E> internalList = new ArrayList<E>();

    // Note that add(E e) in AbstractList is calling this one
    @Override 
    public void add(int position, E e) {
        internalList.add(e);
        Collections.sort(internalList, null);
    }

    @Override
    public E get(int i) {
        return internalList.get(i);
    }

    @Override
    public int size() {
        return internalList.size();
    }

}

Eğer ihtiyacınız yöntemleri geçersiz yok eğer doğru değilse, o zaman AbstractList varsayılan uygulamalar UnsupportedOperationExceptions atmak unutmayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • njhaley

    njhaley

    24 NİSAN 2006
  • ThePointblank

    ThePointblan

    18 Aralık 2006