CodeGym /Java Blogu /Rastgele /Java Deque Arayüzü
John Squirrels
Seviye
San Francisco

Java Deque Arayüzü

grupta yayınlandı
Java Deque, sıradan bir Queue ve Stack'i birleştiren bir veri yapısıdır. Deque'nin hem başına hem de kuyruğuna eleman ekleyebilir ve çıkarabilirsiniz. "Geleneksel" kuyrukta, satırın sonuna (son öğeden sonra) öğeler ekler ve sıranın başından öğeleri kaldırırsınız. Bu ilke, İlk Giren İlk Çıkar (FIFO) olarak adlandırılır ve gerçek hayatta herhangi bir olağan müşteri hattı gibi çalışır. Java Kuyruğu, Koleksiyonlar Çerçevesinin bir parçası olan bir Arayüzdür. Java Deque Arayüzü - 1 Ayrıca Yığın adı verilen önemli bir veri yapısı vardır, öğelerle tamamen ters prensipte çalışan bir liste, LIFO - son giren ilk çıkar. Bir tabak yığınına benzer, ekleme veya çıkarma sadece üstte mümkündür. Java Deque Arayüzü - 2

Kuyruk ve Deque

Deque biraz tuhaf bir Kuyruk türüdür: satırın hem kuyruğuna hem de başına yeni öğeler ekleyebilirsiniz. Kaldırma ile aynı hikaye: bu yapıdan son veya ilk elemanı kaldırabilirsiniz. Bu nedenle, Stack ve Queue karışımı gibi görünüyor. Java Deque Arayüzü - 3“Deque” adı, “Çift Uçlu Kuyruk” anlamına gelir. "Deque" iskambil "destesi" gibi telaffuz edilir ve biliyor musunuz? Bu biraz gerçek bir iskambil destesine benzer: böyle bir destenin altından veya üstünden bir kart alabilirsiniz. Bazı lineer yapıların her iki tarafından da eleman eklemek veya çıkarmak mı istiyorsunuz? Deque'yi kullanın. Java 8 veya hemen hemen tüm diğer sürümler bunu destekler. Tipik bir lego tuğlası ve tuğlalardan yapılmış tek sütunlu "kuleler" hayal edin. Kulenin tepesine veya altına yeni bir tuğla ekleyebilirsiniz. Bir tuğlayı her iki taraftan da çıkarabilirsiniz. Burada bir örneğimiz var: tüm sarı tuğlaları en üste ve tüm kırmızıları en alta ekliyoruz. Bu örneği yakında Java kodu ile göstereceğiz. Java Deque Arayüzü - 4Böylece bir Java Deque'nin her iki ucundan da kuyruğa alabilir ve kuyruğa alabilirsiniz, bu da bir Deque'yi hem kuyruk hem de yığın olarak kullanabileceğiniz anlamına gelir. Java'da Stack hakkında bilgi edinin: Java Stack 101: Stack Sınıfına Girmek Java'da Queue: Java Queue Interface ve uygulamaları hakkında bilgi edinin

Deque'nin özellikleri

  • Java'daki Deque, uygulamaların yeniden boyutlandırılabilir bir dizi desteği sağladığı bir Arayüzdür. Böylece bir dizi kısıtlamasız kapasiteye sahip olursunuz ve ihtiyaçlarınıza göre yeni öğeler ekleyebilirsiniz.
  • Birden fazla iş parçacığı tarafından eşzamanlı erişim, Deque tarafından desteklenmiyor
  • Harici senkronizasyon olmaması durumunda Deque iş parçacığı açısından güvenli değildir.
  • Deque dizisinde boş öğeye izin verilmez.

Deque Java Arayüz bildirimi


public interface Deque<E> extends Queue<E>

Java Deque Yöntemleri

java.util.Deque , Java Kuyruk Arayüzünü genişleten ve çift uçlu bir kuyruğu temsil eden bir Arayüzdür. Böylece bir Deque ile çalışırken tüm Java Kuyruğu yöntemlerini kullanabilirsiniz. Deque, Stack arabirimini genişletmemesine rağmen, Deque arabirimi, push , peek ve pop gibi tipik yığın işlemlerini yapmanızı sağlayan yöntemleri tanımlar .
  • boolean add(element), Deque'nin kuyruğuna bir öğe ekler. Başarı durumunda true değerini döndürür, şu anda boş alan yoksa bir IllegalStateException oluşturur.
  • addFirst(element), Deque'nin başına bir öğe ekler.
  • addLast(element), Deque'nin kuyruğuna bir eleman ekler.
  • Offer(element), kuyruğa bir öğe ekler ve eklemenin başarılı olup olmadığını açıklamak için bir boole döndürür.
  • teklifFirst(element), başa bir öğe ekler ve eklemenin başarılı olup olmadığını açıklamak için bir boole döndürür.
  • OfferLast(element), kuyruğa bir öğe ekler ve eklemenin başarılı olup olmadığını açıklamak için bir boole döndürür.
  • iterator(), deque için bir yineleyici döndürür.
  • azalanIterator(), bu deque için ters sırada olan bir yineleyici döndürür.
  • push(element), başa bir öğe ekler.
  • pop(element), bir öğeyi kafadan kaldırır ve döndürür.
  • removeFirst(), baştaki öğeyi kaldırır.
  • removeLast(), kuyruktaki öğeyi kaldırır.
  • poll(), bu deque tarafından temsil edilen sıranın başını (başka bir deyişle, bu deque'nin ilk öğesini) alır ve kaldırır veya bu deque boşsa null değerini döndürür.
  • pollFirst(), bu deque'nin ilk öğesini alır ve kaldırır veya bu deque boşsa null değerini döndürür.
  • pollLast(), bu deque'nin son öğesini alır ve kaldırır veya bu deque boşsa null değerini döndürür.
  • peek() , bu deque tarafından temsil edilen sıranın başını (başka bir deyişle, bu deque'nin ilk öğesini) alır, ancak kaldırmaz veya bu deque boşsa null değerini döndürür.
  • peekFirst() , bu deque'nin ilk öğesini alır ancak kaldırmaz veya bu deque boşsa null değerini döndürür.
  • peekLast() , bu deque'nin son öğesini alır ancak kaldırmaz veya bu deque boşsa null değerini döndürür.
Aşağıdaki tabloda tüm yöntemler gruplara ayrılmıştır. Gördüğünüz gibi, bir öğeyi eklemek ve kaldırmak için birçok farklı yöntem vardır. Örneğin, hem removeFirst() hem de pop(), ilk öğeyi deque'den kaldırır. İkincisi yığından “geldi”. Bu, ArrayDeque'inizi yalnızca bir yığın olarak kullanıyorsanız, kaldırmak için pop()'u, eklemek için Push()'u ve incelemek için peek()'i kullanın anlamına gelir. Bu, kodunuzu diğer geliştiriciler için daha mantıklı hale getirir.
İlk Eleman (Baş) Son Öğe (Kuyruk)
Operasyon İstisna atar Özel Değer İstisna atar Özel Değer
ekleme addFirst(e)/itme(e) ilk teklif(e) Son ekle(e) teklifSon()
Kaldırmak removeFirst()/pop() anketFirst() Sonuncuyu kaldır() anketSon()
İncelemek getFirst() peekFirst()/peek() Sonuncuyu al() Son gözetleme()

Deque Uygulamaları

Java Deque bir arayüzdür ve Java Koleksiyonları API'sinde uygulamaları vardır:
  • java.util.LinkedList //Liste ve Deque uygulaması
  • java.util.ArrayDeque //Deque uygulaması, Java kitaplığı
Java Deque Arayüzü - 5LinkedList sınıfı, bir kuyruğu veya deque'yi modellemek için dahili olarak çift bağlantılı bir liste kullanır. ArrayDeque sınıfı, öğeleri dahili olarak bir dizide saklar. Öğe sayısı dizinin hacmini aşarsa, yeni bir dizi tahsis edilir ve tüm öğeler taşınır. Bu, ArrayDeque'in ihtiyaçlara göre büyüdüğü anlamına gelir.

ArrayDeque sınıfı

ArrayDeque <E> sınıfı, AbstractCollection sınıfından işlevsellik devralan ve Deque arabirimini kullanan genel iki yönlü bir kuyruktur. ArrayDeque, deque ve yeniden boyutlandırılabilir dizi kullanma kolaylığı sağlar. Başlangıçta, dizi 16 boyutuyla başlatılır. Baş ve kuyruk olmak üzere iki işaretçiyi desteklediği iki yönlü bir sıra olarak uygulanır. AbstractCollection sınıfını devralır ve Deque arayüzünü uygular. ArrayDeque sınıfı ile ilgili önemli noktalar şunlardır:
  • ArrayDeque'in kuyruğuna ve başına öğeler ekleyebilir veya kaldırabilirsiniz.
  • Boş öğelere izin verilmez
  • ArrayDeque, harici senkronizasyon olmadığında iş parçacığı için güvenli değildir.
  • ArrayDeque'in kapasite kısıtlaması yoktur.

ArrayDeque sınıfı Oluşturucuları

  • ArrayDeque() boş bir sıra oluşturur.
  • ArrayDeque (Koleksiyon <? E> koleksiyonunu genişletir), Koleksiyon koleksiyon öğeleriyle dolu bir sıra oluşturur.
  • ArrayDeque (int kapasite), ilk kapasite kapasitesine sahip bir sıra oluşturur . Başlangıç ​​kapasitesini belirtmezseniz, varsayılan kapasite 16'dır.

Java Deque Örneği — ArrayDeque

Yazının başındaki Lego Kulesi Örneği'ni hatırlıyor musunuz? Lego Tuğlalarından yapılmış tek sütunlu Kuleler inşa etmek için bir sınıf oluşturalım. Tuğlalar kırmızı, sarı veya mavi olabilir. Kule inşa etme kuralımız: Kırmızı tuğlaları alta, sarı tuğlaları üste koyuyoruz. Büyük Java Deque Örneği

//enum with colors 
public enum Color {
   RED, YELLOW, BLUE;
}

//class for the standard Lego Brick. You can connect or disconnect the Brick, it has color   
public class LegoBrick {
   Color color;
   boolean isConnected;

   public void connect() {
       System.out.println("This brick is connected");
       this.isConnected = true;
   }

   public void disconnect() {
       System.out.println("Disconnected");
       isConnected = false;
   }

   public LegoBrick(Color color, boolean isConnected) {
       this.color = color;
       this.isConnected = isConnected;
   }

   public Color getColor() {
       return color;
   }

   public boolean isConnected() {
       return isConnected;
   }

   @Override
   public String toString() {
       return "LegoBrick{" +
              "color=" + color +
              ", isConnected=" + isConnected +
              '}';
   }
}
İşte Kule sınıfımız. Bir kule başlatıyoruz. Başlatılan kule, kırmızıların ve sarıların miktarına bağlıdır. Kuleye tuğla ekleyebilir veya kaldırabiliriz. Sarı ise üste tuğla, kırmızı ise alta ekliyoruz.

import java.util.ArrayDeque;
public class LegoTower {
   ArrayDeque<LegoBrick> myTower;
   int quantityOfReds;
   int quantityOfYellows;

   public void addBrickToTower(LegoBrick newLegoBrick) {
       if (newLegoBrick.getColor() == Color.YELLOW) {
           this.myTower.offerLast(newLegoBrick);
           quantityOfYellows++;
       }
	//we can use addFirst(e)/push(e) instead of offerFirst here 
       if (newLegoBrick.getColor() == Color.RED) {
           myTower.offerFirst(newLegoBrick);
           quantityOfReds++;
       }
   }

   public void removeBrickFromTower (LegoBrick legoBrick) {
       if (legoBrick.getColor() == Color.YELLOW) {
           this.myTower.removeLast();
           quantityOfYellows--;
       }
       if (legoBrick.getColor() == Color.RED) {
           myTower.removeFirst();
           quantityOfReds--;
       }
       legoBrick.isConnected = false;

   }

   public LegoTower(int quantityOfReds, int quantityOfYellows) {

       myTower = new ArrayDeque<>();
       this.quantityOfReds = quantityOfReds;
       this.quantityOfYellows = quantityOfYellows;
       for (int i = 0; i < quantityOfReds; i++) {
           LegoBrick redLegoBrick = new LegoBrick(Color.RED, false);
           myTower.addFirst(redLegoBrick);
           redLegoBrick.isConnected = true;
       }
       for (int i = 0; i < quantityOfYellows; i++) {
           LegoBrick yellowLegoBrick = new LegoBrick(Color.YELLOW, false);
           myTower.addLast(yellowLegoBrick);
           yellowLegoBrick.isConnected = true;
       }
   }

   public void setMyTower(ArrayDeque<legobrick> myTower) {
       this.myTower = myTower;
   }

   public void setQuantityOfReds(int quantityOfReds) {
       this.quantityOfReds = quantityOfReds;
   }

   public void setQuantityOfYellows(int quantityOfYellows) {
       this.quantityOfYellows = quantityOfYellows;
   }

   @Override
   public String toString() {
       return "LegoTower{" +
              "myTower=" + myTower +
              ", quantityOfReds=" + quantityOfReds +
              ", quantityOfYellows=" + quantityOfYellows +
              '}';
   }

   public void drawTower() {
       for (LegoBrick i : myTower) {
           System.out.println(i.color);
       }
   }
}


public class Main {
   public static void main(String[] args) {
       LegoBrick legoBrick1 = new LegoBrick(Color.YELLOW, false);
       legoBrick1.connect();
       System.out.println(legoBrick1.toString());
       legoBrick1.disconnect();
       System.out.println(legoBrick1.toString());
       LegoBrick legoBrick2 = new LegoBrick(Color.YELLOW, false);
       LegoBrick legoBrick3 = new LegoBrick(Color.RED, false);
       LegoBrick legoBrick4 = new LegoBrick(Color.RED, false);
       LegoBrick legoBrick5 = new LegoBrick(Color.YELLOW, false);

       LegoTower legoTower = new LegoTower(2, 5);
       System.out.println("my Initiated Lego Tower: ");
       legoTower.drawTower();
       legoTower.addBrickToTower(legoBrick1);
       legoTower.addBrickToTower(legoBrick2);
       legoTower.addBrickToTower(legoBrick3);
       legoTower.addBrickToTower(legoBrick4);
       legoTower.addBrickToTower(legoBrick5);
       System.out.println("My LegoTower after adding some elements: ");
       legoTower.drawTower();
       legoTower.removeBrickFromTower(legoBrick1);
       legoTower.removeBrickFromTower(legoBrick3);
       System.out.println("We removed one red and one yellow brick:");
       legoTower.drawTower();

   }

}
Bu programı çalıştırmanın sonucu:

my Initiated LegoTower:

RED
RED
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
My LegoTower after adding some elements: 
RED
RED
RED
RED
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
We removed one red and one yellow brick:
RED
RED
RED
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW

Process finished with exit code 0
Bir dakika ne?? Kırmızılar neden üstte? Hayır, yapmazlar. İlkinden (alttan) sonuncuya (üste) başlayarak konsola yazdırdılar. Yani yukarıdaki tuğlalarla resimdeki gibi bir şey görmek istiyorsanız LegoTower sınıfının drawTower yöntemini değiştirebilirsiniz. Bu çok kolay bir iştir!

Bağlantılı liste

Liste arayüzü, öğe ekleme sırasını korur ve öğeye dizine göre erişim sağlar. Deque iki yönlü bir sıradır ve her iki taraftan öğe eklemeyi ve kaldırmayı destekler. Java Deque Arayüzü - 6LinkedList, esas olarak bir List uygulaması olarak bilinir, ancak bu sınıf aynı zamanda Deque'yi uygular ve null dahil herhangi bir nesneden oluşan çift yönlü bir kuyruk oluşturmamızı sağlar. LinkedList bir öğeler koleksiyonudur. Sınıfın kod kaynağında görebiliyoruz, bu sefer alanlara dikkat edin: Burada bir örnek ekliyoruz, ancak LinkedList hakkında daha fazla bilgi edinmek istiyorsanız, bu CodeGym makalesine hoş geldiniz .

Java'da bağlantılı liste uygulaması, öğe ekleme ve kaldırma. Örnek

Bu işlemleri uygulamalı olarak deneyelim. İlk olarak, Java LinkedList uygulaması: bir LinkedList of Strings oluşturmak, oraya 3 öğe eklemek. Sonra birini çıkarın, ardından ortasına bir tane ekleyin.

public class MyLinkedTest {
   public static void main(String[] args) {
       String h1 = "my";
       String h2 = "favorite";
       String h3 = "book";
//  LinkedList implementation in Java
       LinkedList<string> linkedList = new LinkedList();
       linkedList.add(h1);
       linkedList.add(h2);
       linkedList.add(h3);
       System.out.println("my list after adding 3 elements:");
       System.out.println(linkedList);
       System.out.println("element #2 of my list:");
       System.out.println(linkedList.get(2));
       linkedList.remove(1);
       System.out.println("my list after removing #1:");
       System.out.println(linkedList);
       linkedList.add(1,"first");
       System.out.println("my list after adding an element in the middle");
       System.out.println(linkedList);
   }
Bu programı çalıştırmanın sonucu:

my list after adding 3 elements:
[my, favorite, book]
element #2 of my list:
book
my list after removing #1:
[my, book]
my list after adding an element in the middle
[my, first, book]
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION