2008-11-19 19 views
28

herhangi bir başarı olmadan bir LIFO Yapısı (Stack) için Java Koleksiyonları çerçevesinde arıyorum. Temel olarak gerçekten basit bir yığın istiyorum; benim mükemmel seçenek deque olurdu, ama ben Java 1.5 içindeyim.Java Koleksiyonları (LIFO Yapısı)

  1. herhangi sınıfı iş yapar Koleksiyonları çerçevesinde (1.5) var mı:

    benim yapısına başka bir sınıf eklemek zorunda değil istiyorum ama bu mümkün olup olmadığını merak ediyorum?

  2. Değilse, yeniden sıralama olmadan bir LIFO Sırasındaki (aka Stack) bir Kuyruğu döndürmenin herhangi bir yolu var mı? Arayüz veya dersiniz bu görev için uzanmalıdır

  3. Değilse

    ? Bunu Güneşin adamlar deque ile iyi bir başlangıç ​​olduğunu yaptık şekilde tutmak sanırım.

Çok teşekkürler.

DÜZENLEME: Yığın sınıfı hakkında şunu söylemeyi unuttum: Vector sınıfını uyguladığını gördüğümde, bu sınıf hakkında şüphelerim var ve Vector sınıfı biraz modası geçmiş değil mi?

+2

Vector ile ilgili temel sorun, ihtiyacınız olsun ya da olmasın, tüm erişimin senkronize edilmesidir. Diğer koleksiyonlardan biri olarak "güncel" dir, ancak senkronizasyon sorunu nedeniyle kötü bir şöhrete sahip olmuştur. –

cevap

46

aslında bir Stack sınıfı vardır: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Stack.html

Bunu, LinkedList sınıf (http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html) bir yığın olarak veya kullanım için mükemmel hale, addFirst ve addLast ve removeFirst ve removeLast yöntemleri vardır kullanmak istemiyorsanız sıra sınıfı.

+4

LinkedList, daha sonra istediğiniz koleksiyon olan Deque'in tanımını sağlar. –

+1

Evet, LinkedList'in aradığım şey olduğunu düşünüyorum, çünkü ilk bakışımda Addfirst ve removeFirst yöntemleri hakkında farketmedim. Çok teşekkürler. –

+0

sadece sorun, Deque'nin API Seviye 9'da uygulandığıdır. – Necronet

6

bir Stack class in the API yoktur. Bu ihtiyaçlarınızı karşılayacak mı?

+0

Yığın Sınıfı ve onun hakkındaki düşüncelerim hakkında Söylemeyi unuttum, ama muhtemelen kendi sınıfımı uygulamaktan daha iyi bir çözüm olduğunu düşünüyorum. öyle değil mi –

+5

Yığın sınıfını kullanmayın. Yalnızca geriye dönük uyumluluk için saklanan Vector'i genişletir. – erickson

8

Stack sınıf yavaş yavaş: yöntemler senkronize edilir + Stac k Vector

5

bu bir süre önce istendi iken şimdi ArrayDeque veri yapısıyla uygulanır ve LinkedList Bunu uygulamak güncellendi bir Deque (güverte) arayüzü sağlayan bir JDK6 + cevap vermek akıllıca olabilir arayüz. Eşzamanlı erişim için özel formlar da mevcuttur ve ConcurrentLinkedDeque ve LinkedBlockingDeque tarafından uygulanır.

Deque hakkında harika olan şey, hem LIFO (yığın) hem de FIFO (sıra) desteği sağlamasıdır; bu, kuyruk işlemleri için hangi yöntemlerin kullanıldığı ve yeni gelenler için yığın işlemleri için olan karışıklıklara neden olabilir.

IMHO JDK bir Stack arayüzü ve yine ArrayDeque gibilerin uygulanacak ancak bu yapı için gerekli yöntemler alt kümesini açığa çıkaracak bir Queue arayüzü, diğer bir deyişle olması gerekirLIFO sadece operasyon push(E) amaçlanan zaman birinin kazayla add(E) çağrı durur maruz yığın

LIFO<String> stack = new ArrayDeque<>(); 

bağlamında daha sonra pop(), push() ve peek(), tanımlayabilir.

-1

Sadece tam anlamıyla bir Dequeue ve salt LinkedList örneği sağlıyorum. Bir LinkedList ile kombinasyon halinde Dequeue arayüzünü kullanarak

(önerilen):

Deque<String> dequeue = new LinkedList<>(); 
    dequeue.add("first"); 
    dequeue.add("last"); 

    // returns "last" without removing it 
    System.out.println(dequeue.peekLast()); 

    // removes and returns "last" 
    System.out.println(dequeue.pollLast()); 

bir LinkedList ile dequeue yedekleme sokulması ve (sabit zaman yapılır öğeler çıkarılması için, bir performans için büyük O (1)).

yalnız bir LinkedList kullanma:

LinkedList<String> list = new LinkedList<>(); 
    list.add("first"); 
    list.add("last"); 

    // returns "last" without removing it 
    System.out.println(list.getLast()); 

    // removes and returns "last" 
    System.out.println(list.removeLast()); 
+0

Orijinal gönderi, FIFO ve LIFO değil bir Queue kullanıyordu, bu yüzden cevabımı güncelledim. – Ivo

-1

En basit cevap bir ArrayList kullanın ve sadece 0 dizinde nesneler eklemek olacaktır.

List<String> arrayList = new ArrayList<>(); 
arrayList.add(0, "three"); 
arrayList.add(0, "two"); 
arrayList.add(0, "one"); 

// Prints: [one, two, three] 
System.out.println(arrayList); 

0 dizine nesne eklemek listenin en üstüne eklenir ve listenin geri kalanını kaydırır. Artık basit bir işleyen LIFO veri yapısına sahipsiniz.

DÜZENLEME: Bir LinkedList kullanmak bir ArrayList kullanmaktan daha hızlıdır. Bu yüzden LinkedList.addFirst() kullanmak daha iyidir.

+1

Bu, vites değiştirme nedeniyle performans açısından iyi bir fikir değildir. Bir LinkedList burada daha iyi bir iş yapardı. – Ivo

İlgili konular