Teknologian jakaminen

[Java-tietorakenne] Yksi ensimmäisistä lineaarisista taulukoista: peräkkäinen taulukko

2024-07-12

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

Sekvenssitaulukon yksinkertainen toteutus Javalla

Sekvenssitaulukko on lineaarinen rakenne, joka käyttää jatkuvan fyysisen osoitteen omaavaa tallennusyksikköä dataelementtien tallentamiseen järjestyksessä. Suorita taulukon tietojen lisääminen, poistaminen, tarkistaminen ja muokkaaminen.

Lineaariset taulukot sisältävät yleensä seuraavat menetelmät:

julkinen luokka MyArrayList {
yksityinen int[] array;
yksityinen int koko;
   //Oletusmuodostusmenetelmä varaa tilaa oletuksena
SeqList(){ }
    // Aseta sekvenssitaulukon taustalla oleva kapasiteetti määritettyyn kapasiteettiin
SeqList(int initcapacity){ }

   // Lisää uusia elementtejä, oletuksena ne lisätään taulukon loppuun
public void add(int data) { }
    //Lisää elementti pos-sijaintiin
public void add(int pos, int data) { }
   // Määrittää, sisältyykö elementti
public boolean sisältää(int toFind) { return true; }
    // Etsi elementtiä vastaava sijainti
public int indexOf(int toFind) { return -1; }
    // Hae elementti pos-asentoon
public int get(int pos) { return -1; }
   // Aseta elementin positiossa arvoksi
public void set(int pos, int value) { }
    //Poista avainsanaavaimen ensimmäinen esiintymä
public void poista (int toRemove) { }
   // Hanki sekvenssitaulukon pituus
public int koko() { return 0; }
    //Tyhjennä sekvenssitaulukko
public void clear() { }
   
   //Tulosta järjestystaulukko
julkinen void näyttö() { }
}

Toteuta seuraavaksi int-tyyppinen sekvenssitaulukko yllä olevan menetelmän mukaisesti:

  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. }

ArrayListin esittely

Kokoelmakehyksessä ArrayList on tavallinen luokka, joka toteuttaa List-rajapinnan. Tarkka kehyskaavio on seuraava:

  • ArrayList on toteutettu yleisellä tavalla ja se on instantioitava ennen käyttöä.
  • ArrayList toteuttaa RandomAccess-rajapinnan, mikä osoittaa, että ArrayList tukee satunnaiskäyttöä
  • ArrayList toteuttaa Cloneable-rajapinnan, mikä osoittaa, että ArrayList voidaan kloonata
  • ArrayList toteuttaa Serializable-rajapinnan, mikä osoittaa, että ArrayList tukee serialisointia
  • Toisin kuin Vector, ArrayList ei ole säikeen turvallinen ja sitä voidaan käyttää yhdessä säikeessä. Voit valita Vector tai
  • CopyOnWriteArrayList
  • ArrayListin alin kerros on jatkuva tila ja sitä voidaan laajentaa dynaamisesti. Se on dynaamisen tyyppinen sekvenssiluettelo.

Kuinka käyttää ArrayListiä

ArrayList-konstruktori

Konstruktorimenetelmä ArrayListissä:

ArrayList(); //Ei parametrien rakentamista

ArrayList(kokoelma<? extends E> c); //Käytä muita kokoelmia ArrayListin rakentamiseen

ArrayList(int originCapacity) //Määritä sekvenssitaulukon alkuperäinen kapasiteetti

Esimerkki koodista:

  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. }

ArrayListin yleiset toiminnot

häntätulppa

  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. }

Aseta elementti määritettyyn kohtaan

  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. }

Lopeta lisäyselementit toisesta sekvenssiluettelosta

  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. }

Poista elementti määritetystä sijainnista

  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. }

Poista määritetyt tiedot

  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. }

Hanki elementti määritettyyn kohtaan

  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. }

Asettaa määritetyn kohdan elementin uusiin tietoihin

  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. }

Tyhjennä sekvenssiluettelo

  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. }

Selvitä, onko elementti sarjaluettelossa

  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. }

Palauttaa ensimmäisen määritetyn elementin indeksin

  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. }

Palauttaa viimeksi määritetyn elementin indeksin

  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. }

Sieppaa osa luettelosta

  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. }

Kolme tapaa kulkea ArrayListin läpi

ArrayList voidaan kulkea kolmella tavalla: foreach + alaindeksi, foreach parannettu silmukka ja iteraattorit

  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. }

operaation tulos:

Skenaario ArrayListin käyttö

Sekoitusalgoritmi

Sekoita pelikorttipakka satunnaisesti ja jaa ne kolmelle henkilölle, joista jokaisella on viisi korttia.

Algoritmin alkuperäisen koodin sijainti:

sekoituskortit · Aina makean veden kala/Java Classic Esimerkit - Code Cloud - Open Source Kiina (gitee.com)

Yang Huin kolmio

Aiheen kuvaus:

Koodi:

  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. }

Käynnissä oleva tuloskaavio: