Berbagi teknologi

[Struktur data Java] Salah satu tabel linier pertama: tabel berurutan

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Implementasi sederhana dari tabel urutan menggunakan Java

Tabel urutan adalah struktur linier yang menggunakan unit penyimpanan dengan alamat fisik kontinu untuk menyimpan elemen data secara berurutan. Umumnya, penyimpanan array digunakan. Menyelesaikan penambahan, penghapusan, pengecekan dan modifikasi data pada array.

Tabel linier umumnya mencakup metode berikut:

kelas publik MyArrayList {
pribadi int[] array;
pribadi int ukuran;
   //Metode konstruksi default mengalokasikan ruang secara default
Daftar Seq(){ }
    // Atur kapasitas dasar tabel urutan ke kapasitas yang ditentukan
SeqList(int kapasitas init){ }

   // Tambahkan elemen baru, secara default elemen tersebut ditambahkan di akhir array
publik void tambahkan(int data) { }
    //Tambahkan elemen pada posisi pos
publik void tambahkan(int pos, int data) { }
   // Menentukan apakah suatu elemen ada di dalamnya
publik boolean berisi (int toFind) { kembalikan benar; }
    // Temukan posisi yang sesuai dengan suatu elemen
publik int indexOf(int yang dicari) { kembali -1; }
    // Dapatkan elemen pada posisi pos
publik int dapatkan(int pos) { kembalikan -1; }
   // Tetapkan elemen pada posisi pos ke nilai
publik void set(int pos, int nilai) { }
    //Hapus kemunculan pertama dari kunci kata kunci
publik void hapus(int toRemove) { }
   // Mendapatkan panjang tabel sequence
publik int ukuran() { kembalikan 0; }
    //Hapus tabel urutan
publik batal() { }
   
   //Cetak tabel urutan
publik void tampilan() { }
}

Selanjutnya, implementasikan tabel urutan bertipe int sesuai dengan metode di atas:

  1. import java.util.Arrays;
  2. public class MyArrayList {
  3. private int[] elem;
  4. private int usedSize;
  5. private static final int DEFAULT_SIZE = 10;
  6. public MyArrayList(){
  7. elem = new int[DEFAULT_SIZE];
  8. }
  9. public MyArrayList(int initCapacity){
  10. elem = new int[initCapacity];
  11. }
  12. private boolean checkCapacity(){
  13. if(this.usedSize == elem.length){
  14. return true;
  15. }
  16. return false;
  17. }
  18. public void display(){
  19. for (int i = 0; i < this.usedSize; i++) {
  20. System.out.print(this.elem[i] + " ");
  21. }
  22. }
  23. public void add(int data){
  24. if(checkCapacity()){
  25. this.elem = Arrays.copyOf(this.elem,2*elem.length);
  26. }
  27. this.elem[this.usedSize] = data;
  28. this.usedSize++;
  29. return;
  30. }
  31. public void add(int pos,int data){
  32. if(pos > this.usedSize || pos < 0){
  33. throw new PosOutOfBoundsException("插入位置错误!");
  34. }
  35. if(checkCapacity()){
  36. this.elem = Arrays.copyOf(this.elem,2*elem.length);
  37. }
  38. for (int i = this.usedSize - 1; i >=pos ; i--) {
  39. elem[i+1] = elem[i];
  40. }
  41. this.elem[pos] = data;
  42. this.usedSize++;
  43. return;
  44. }
  45. public boolean contains(int data){
  46. for (int i = 0; i < this.usedSize; i++) {
  47. if(this.elem[i] == data){
  48. return true;
  49. }
  50. }
  51. return false;
  52. }
  53. public int indexof(int data){
  54. for (int i = 0; i < this.usedSize; i++) {
  55. if(this.elem[i] == data){
  56. return i;
  57. }
  58. }
  59. return -1;
  60. }
  61. public int get(int pos){
  62. if(pos >= this.usedSize || pos < 0){
  63. throw new PosOutOfBoundsException("输入的位置错误!");
  64. }
  65. return this.elem[pos];
  66. }
  67. public void set(int pos,int data){
  68. if(pos >= this.usedSize || pos < 0){
  69. throw new PosOutOfBoundsException("输入的位置错误!");
  70. }
  71. this.elem[pos] = data;
  72. }
  73. public int size(){
  74. return this.usedSize;
  75. }
  76. public void remove(int data){
  77. if(this.contains(data)){
  78. int pos = this.indexof(data);
  79. for (int i = pos; i < this.usedSize - 1; i++) {
  80. this.elem[pos] = this.elem[pos+1];
  81. }
  82. this.usedSize--;
  83. }else{
  84. throw new PosOutOfBoundsException("没有该元素");
  85. }
  86. }
  87. public void clear(){
  88. this.usedSize = 0;
  89. return;
  90. }
  91. }

Pengantar ArrayList

Dalam kerangka koleksi, ArrayList adalah kelas biasa yang mengimplementasikan antarmuka Daftar. Diagram kerangka spesifiknya adalah sebagai berikut:

  • ArrayList diimplementasikan secara umum dan harus dipakai sebelum digunakan.
  • ArrayList mengimplementasikan antarmuka RandomAccess, yang menunjukkan bahwa ArrayList mendukung akses acak
  • ArrayList mengimplementasikan antarmuka Cloneable, yang menunjukkan bahwa ArrayList dapat dikloning
  • ArrayList mengimplementasikan antarmuka Serializable, yang menunjukkan bahwa ArrayList mendukung serialisasi
  • Tidak seperti Vector, ArrayList tidak aman untuk thread dan dapat digunakan dalam satu thread. Di multi-thread, Anda dapat memilih Vector atau
  • SalinPadaTulisDaftarArray
  • Lapisan bawah ArrayList adalah ruang berkelanjutan dan dapat diperluas secara dinamis. Ini adalah daftar urutan yang diketik secara dinamis.

Cara menggunakan ArrayList

Konstruktor ArrayList

Metode konstruktor di ArrayList:

ArrayList(); //Tidak ada konstruksi parameter

Daftar Array(Koleksi<? extends E> c); //Gunakan Koleksi lain untuk membuat ArrayList

ArrayList(int initialCapacity); //Tentukan kapasitas awal tabel urutan

Contoh kode:

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list1 = new ArrayList<>();//无参构造
  4. List<Integer> list2 = new ArrayList<>(10);//指定容量
  5. list2.add(1);
  6. list2.add(2);
  7. list2.add(3);
  8. List<Integer> list3 = new ArrayList<>(list2);//利用其他 Collection 构建 ArrayList
  9. }
  10. }

Operasi umum di ArrayList

sumbat ekor

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();//无参构造
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. System.out.println(list);
  8. }
  9. }

Sisipkan elemen pada posisi tertentu

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. list.add(1,4);
  8. System.out.println(list);
  9. }
  10. }

Akhiri penyisipan elemen dari daftar urutan lain

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list1 = new ArrayList<>();
  4. list1.add(4);
  5. list1.add(5);
  6. list1.add(6);
  7. List<Integer> list = new ArrayList<>();
  8. list.add(1);
  9. list.add(2);
  10. list.add(3);
  11. list.addAll(list1);
  12. System.out.println(list);
  13. }
  14. }

Hapus elemen pada posisi yang ditentukan

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. list.remove(1);
  8. System.out.println(list);
  9. }
  10. }

Hapus data tertentu

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. list.remove(new Integer(2));
  8. System.out.println(list);
  9. }
  10. }

Dapatkan elemen pada posisi yang ditentukan

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. System.out.println(list.get(1));
  8. }
  9. }

Menyetel elemen pada posisi yang ditentukan ke data baru

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. list.set(1,4);
  8. System.out.println(list);
  9. }
  10. }

Hapus daftar urutan

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. list.clear();
  8. System.out.println(list);
  9. }
  10. }

Tentukan apakah suatu elemen ada dalam daftar urutan

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. System.out.println(list.contains(2));
  8. System.out.println(list.contains(4));
  9. }
  10. }

Mengembalikan indeks elemen pertama yang ditentukan

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. list.add(1);
  8. System.out.println(list.indexOf(1));
  9. }
  10. }

Mengembalikan indeks elemen yang terakhir ditentukan

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. list.add(1);
  8. System.out.println(list.lastIndexOf(1));
  9. }
  10. }

Cegat bagian dari daftar

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. System.out.println(list.subList(0,2));
  8. }
  9. }

Tiga cara untuk melintasi ArrayList

ArrayList dapat dilintasi dengan tiga cara: for loop + subscript, foreach enhancement loop, dan menggunakan iterator

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. list.add(3);
  7. //使用fori遍历
  8. for (int i = 0; i < list.size(); i++) {
  9. System.out.print(list.get(i));
  10. }
  11. System.out.println();
  12. //使用foreach遍历
  13. for(Integer integer:list){
  14. System.out.print(integer);
  15. }
  16. System.out.println();
  17. //使用迭代器遍历
  18. Iterator<Integer> it = list.listIterator();
  19. while(it.hasNext()){
  20. System.out.print(it.next());
  21. }
  22. }
  23. }

hasil operasi:

Skenario penggunaan ArrayList

Algoritma pengacakan

Kocok setumpuk kartu remi secara acak dan bagikan kepada tiga orang, masing-masing dengan lima kartu.

Lokasi kode asli algoritma:

shufflecards · Ikan Air Tawar Selalu/Contoh Klasik Java - Code Cloud - Open Source China (gitee.com)

Segitiga Yang Hui

Deskripsi Topik:

Kode:

  1. public class Test {
  2. public static List<List<Integer>> generate(int numRows) {
  3. List<List<Integer>> list = new LinkedList<>();
  4. for (int i = 0; i < numRows; i++) {
  5. List<Integer> row = new LinkedList<>();
  6. for (int j = 0; j < i + 1; j++) {
  7. if (j == 0 || i == j) {
  8. row.add(1);
  9. } else {
  10. row.add(list.get(i - 1).get(j - 1) + list.get(i - 1).get(j));
  11. }
  12. }
  13. list.add(row);
  14. }
  15. return list;
  16. }
  17. public static void main(String[] args) {
  18. Scanner scanner = new Scanner(System.in);
  19. int numRows = scanner.nextInt();
  20. List<List<Integer>> list = generate(numRows);
  21. for (int i = 0; i < numRows; i++) {
  22. for (int j = 0; j < i + 1; j++) {
  23. System.out.print(list.get(i).get(j) + " ");
  24. }
  25. System.out.println();
  26. }
  27. }
  28. }

Grafik hasil berjalan: