CodeGym/Blog Java/rawak/Antara Muka Java Deque
John Squirrels
Tahap
San Francisco

Antara Muka Java Deque

Diterbitkan dalam kumpulan
Java Deque ialah struktur data yang menggabungkan Queue dan Stack biasa. Anda boleh menambah dan mengalih keluar elemen pada kepala dan ekor Deque. Dalam baris gilir "tradisional" anda menambah elemen pada ekor baris (selepas elemen terakhir) dan mengalih keluar elemen dari kepala baris gilir. Prinsip ini dipanggil First In First Out (FIFO) dan ia berfungsi seperti mana-mana barisan pelanggan biasa dalam kehidupan sebenar. Dalam Java Queue ialah Antara Muka, sebahagian daripada Rangka Kerja Koleksi. Antara Muka Java Deque - 1 Terdapat juga struktur data penting yang dipanggil Stack, senarai yang berfungsi dengan elemen dalam prinsip songsang sepenuhnya, LIFO — masuk terakhir, keluar dahulu. Ia serupa dengan timbunan plat, menambah atau mengalih keluar hanya boleh dilakukan di bahagian atas. Antara Muka Java Deque - 2

Beratur vs Deque

Deque adalah jenis Gilir yang agak pelik: anda boleh menambah elemen baharu pada ekor dan kepala baris. Cerita yang sama dengan mengalih keluar: anda boleh mengalih keluar elemen terakhir atau pertama daripada struktur ini. Oleh itu, ia seolah-olah menjadi campuran Stack dan Queue. Antara Muka Java Deque - 3Nama "Deque" bermaksud "Baris Berganda Berakhir". “Deque” disebut seperti "dek" kad dan anda tahu apa? Ia agak serupa dengan dek kad sebenar: anda boleh mengambil kad dari bahagian bawah atau atas dek sedemikian. Mahu menambah atau mengalih keluar elemen dari kedua-dua belah beberapa struktur linear? Gunakan Deque. Java 8 atau hampir mana-mana versi lain menyokongnya. Bayangkan bata lego biasa dan "menara" satu lajur yang diperbuat daripada bata itu. Anda boleh menambah bata baharu ke bahagian atas menara atau ke bahagian bawah. Anda juga boleh mengeluarkan bata dari kedua-dua belah pihak. Di sini kita mempunyai contoh: kita menambah semua bata kuning ke bahagian atas dan semua merah ke bahagian bawah. Kami akan menunjukkan contoh ini dengan kod Java tidak lama lagi. Antara Muka Java Deque - 4Jadi anda boleh enqueue dan dequeue dari kedua-dua hujung Java Deque, ini bermakna anda boleh menggunakan Deque sebagai kedua-dua baris gilir dan tindanan. Baca tentang Stack in Java: Java Stack 101: Menyelidiki Kelas Stack Baca tentang Queue in Java: Java Queue Interface dan pelaksanaannya

Ciri-ciri Deque

  • Deque dalam Java ialah Antara Muka, yang pelaksanaannya menyediakan sokongan tatasusunan boleh ubah saiz. Jadi anda mempunyai pelbagai kapasiti bebas sekatan dan anda boleh menambah elemen baharu mengikut keperluan anda.
  • Akses serentak oleh berbilang rangkaian tidak disokong oleh Deque
  • Deque tidak selamat untuk benang sekiranya tiada penyegerakan luaran.
  • Tiada unsur Null dibenarkan dalam deque tatasusunan.

Deque Java Interface pengisytiharan

public interface Deque<E> extends Queue<E>

Kaedah Java Deque

java.util.Deque ialah Antara Muka yang memanjangkan Antara Muka Baris Java dan mewakili baris gilir berkembar dua. Jadi anda boleh menggunakan semua kaedah Java Queue semasa bekerja dengan Deque. Walaupun Deque tidak memanjangkan antara muka Stack, antara muka Deque mentakrifkan kaedah yang membolehkan anda melakukan operasi tindanan biasa seperti push , peek dan pop .
  • boolean add(element) menambah elemen pada ekor Deque. Mengembalikan benar pada kejayaan, membuang IllegalStateException jika tiada ruang tersedia pada masa ini.
  • addFirst(elemen) menambah elemen pada kepala Deque.
  • addLast(elemen) menambah elemen pada ekor Deque.
  • offer(element) menambah elemen pada ekor dan mengembalikan boolean untuk menerangkan jika sisipan berjaya.
  • offerFirst(elemen) menambah elemen pada kepala dan mengembalikan boolean untuk menerangkan jika sisipan berjaya.
  • offerLast(element) menambah elemen pada ekor dan mengembalikan boolean untuk menerangkan jika sisipan berjaya.
  • iterator() mengembalikan iterator untuk deque.
  • descendingIterator() mengembalikan iterator yang mempunyai susunan terbalik untuk deque ini.
  • push(elemen) menambah elemen pada kepala.
  • pop(elemen) mengalih keluar elemen dari kepala dan mengembalikannya.
  • removeFirst() mengalih keluar elemen di kepala.
  • removeLast() mengalih keluar elemen di ekor.
  • poll() mengambil dan mengalih keluar kepala baris gilir yang diwakili oleh deque ini (dengan kata lain, elemen pertama deque ini), atau mengembalikan null jika deque ini kosong.
  • pollFirst() mengambil dan mengalih keluar elemen pertama deque ini, atau mengembalikan null jika deque ini kosong.
  • pollLast() mengambil dan mengalih keluar elemen terakhir deque ini, atau mengembalikan null jika deque ini kosong.
  • peek() mendapatkan semula, tetapi tidak mengalih keluar, kepala baris gilir yang diwakili oleh deque ini (dengan kata lain, elemen pertama deque ini), atau mengembalikan null jika deque ini kosong.
  • peekFirst() mendapatkan semula, tetapi tidak mengalih keluar, elemen pertama deque ini, atau mengembalikan null jika deque ini kosong.
  • peekLast() mendapatkan semula, tetapi tidak mengalih keluar, elemen terakhir deque ini, atau mengembalikan null jika deque ini kosong.
Di sini dalam jadual di bawah semua kaedah dibahagikan mengikut kumpulan. Seperti yang anda lihat terdapat banyak kaedah yang berbeza untuk menambah dan mengalih keluar elemen. Sebagai contoh, kedua-dua removeFirst() dan pop() mengeluarkan elemen pertama daripada deque. Yang kedua "datang" dari timbunan. Ini bermakna jika anda menggunakan ArrayDeque anda sebagai timbunan sahaja, gunakan pop() untuk mengalih keluar, push() untuk menambah dan mengintip() untuk memeriksa. Ini menjadikan kod anda lebih masuk akal untuk pembangun lain.
Elemen Pertama (Kepala) Elemen Terakhir (Ekor)
Operasi Melempar Pengecualian Nilai Istimewa Melempar Pengecualian Nilai Istimewa
Sisipan addFirst(e)/push(e) offerFirst(e) addLast(e) offerLast()
Alih keluar removeFirst()/pop() pollFirst() removeLast() pollLast()
Periksa getFirst() peekFirst()/peek() getLast() peekLast()

Pelaksanaan Deque

Java Deque ialah antara muka dan mempunyai pelaksanaan dalam Java Collections API:
  • java.util.LinkedList //Senarai dan pelaksanaan Deque
  • java.util.ArrayDeque //Pelaksanaan Deque, perpustakaan Java
Antara Muka Java Deque - 5Kelas LinkedList menggunakan senarai dua pautan secara dalaman untuk memodelkan baris gilir atau deque. Kelas ArrayDeque menyimpan elemen secara dalaman dalam tatasusunan. Jika bilangan elemen melebihi volum tatasusunan, tatasusunan baharu akan diperuntukkan dan semua elemen dipindahkan. Ini bermakna ArrayDeque berkembang mengikut keperluan.

Kelas ArrayDeque

Kelas ArrayDeque <E> ialah baris gilir dua arah umum, mewarisi fungsi daripada kelas AbstractCollection dan menggunakan antara muka Deque. ArrayDeque menyediakan kemudahan menggunakan deque dan resizable-array. Pada mulanya, tatasusunan dimulakan dengan saiz 16. Ia dilaksanakan sebagai baris gilir dua hala, di mana ia menyokong dua penunjuk, iaitu kepala dan ekor. Ia mewarisi kelas AbstractCollection dan melaksanakan antara muka Deque . Perkara penting tentang kelas ArrayDeque ialah:
  • Anda boleh menambah atau mengalih keluar elemen daripada ekor dan kepala ArrayDeque
  • Elemen nol tidak dibenarkan
  • ArrayDeque tidak selamat untuk thread, jika tiada penyegerakan luaran.
  • ArrayDeque tidak mempunyai sekatan kapasiti.

Pembina kelas ArrayDeque

  • ArrayDeque() mencipta baris gilir kosong.
  • ArrayDeque (Koleksi <? Melanjutkan E> koleksi) mencipta baris gilir yang diisi dengan elemen koleksi Koleksi.
  • ArrayDeque (kapasiti int) mencipta baris gilir dengan kapasiti kapasiti awal . Jika anda tidak menyatakan kapasiti awal, kapasiti lalai ialah 16.

Contoh Java Deque — ArrayDeque

Ingat Contoh Menara Lego dari awal artikel? Mari buat kelas untuk Membina Menara satu lajur yang diperbuat daripada Bata Lego. Bata boleh merah, kuning atau biru. Peraturan bangunan Menara kami: kami meletakkan bata merah di bahagian bawah dan bata kuning di bahagian atas. Contoh Deque Java Besar
//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 +
              '}';
   }
}
Inilah kelas Menara kami. Kami memulakan sebuah menara. Menara yang dimulakan bergantung pada kuantiti merah dan kuning. Kita boleh menambah bata ke menara atau mengeluarkannya. Kami menambah bata ke bahagian atas jika ia kuning dan menambahnya ke bahagian bawah jika ia merah.
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();

   }

}
Hasil daripada menjalankan program ini:
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
Tunggu apa?? Mengapa merah di bahagian atas? Tidak, mereka tidak. Mereka hanya mencetak ke consol bermula dari yang pertama (bawah) hingga yang terakhir (atas). Jadi jika anda ingin melihat sesuatu seperti dalam gambar dengan batu bata di atas, anda boleh menukar kaedah drawTower kelas LegoTower. Ia adalah satu tugas yang sangat mudah!

LinkedList

Antara muka Senarai menyimpan urutan penambahan item dan membenarkan akses kepada item mengikut indeks. Deque ialah baris gilir dua hala, dan ia menyokong menambah dan mengalih keluar elemen dari kedua-dua belah pihak. Antara Muka Java Deque - 6LinkedList terutamanya dikenali sebagai pelaksanaan Senarai, tetapi kelas ini juga melaksanakan Deque, dan ia membolehkan kami membuat baris gilir dua arah yang terdiri daripada sebarang objek termasuk null. LinkedList ialah koleksi elemen. Kita boleh melihatnya dalam sumber kod kelas, kali ini perhatikan medan: Di sini kami menambah satu contoh, tetapi jika anda ingin mengetahui lebih lanjut mengenai LinkedList, selamat datang ke artikel CodeGym ini .

Pelaksanaan senarai terpaut dalam Java, menambah dan mengalih keluar elemen. Contoh

Mari cuba operasi ini dalam amalan. Pertama, pelaksanaan Java LinkedList: mencipta LinkedList of Strings, menambah di sana 3 elemen. Kemudian keluarkan satu, kemudian tambah satu di tengah.
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);
   }
Hasil daripada menjalankan program ini:
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]
Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi