Κοινή χρήση τεχνολογίας

[Δομή δεδομένων Java] Ένας από τους πρώτους γραμμικούς πίνακες: διαδοχικός πίνακας

2024-07-12

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

Απλή υλοποίηση ενός πίνακα ακολουθιών με χρήση Java

Ένας πίνακας ακολουθιών είναι μια γραμμική δομή που χρησιμοποιεί μια μονάδα αποθήκευσης με συνεχείς φυσικές διευθύνσεις για την αποθήκευση στοιχείων δεδομένων στη σειρά. Ολοκληρώστε την προσθήκη, διαγραφή, έλεγχο και τροποποίηση δεδομένων στον πίνακα.

Οι γραμμικοί πίνακες γενικά περιλαμβάνουν τις ακόλουθες μεθόδους:

δημόσια τάξη MyArrayList {
ιδιωτικός πίνακας int[];
ιδιωτικό μέγεθος int?
   //Η προεπιλεγμένη μέθοδος κατασκευής εκχωρεί χώρο από προεπιλογή
SeqList(){}
    // Ορίστε την υποκείμενη χωρητικότητα του πίνακα ακολουθιών στην καθορισμένη χωρητικότητα
SeqList(int initcapacity){ }

   // Προσθήκη νέων στοιχείων, από προεπιλογή προστίθενται στο τέλος του πίνακα
δημόσιο κενό πρόσθετο(int data) { }
    //Προσθήκη στοιχείου στη θέση θέσης
δημόσια κενή προσθήκη(int pos, int data) { }
   // Προσδιορίστε εάν περιέχεται ένα στοιχείο
public boolean περιέχει(int toFind) { return true; }
    // Βρείτε τη θέση που αντιστοιχεί σε ένα στοιχείο
public int indexOf(int toFind) { return -1; }
    // Λάβετε το στοιχείο στη θέση θέσης
public int get(int pos) { return -1; }
   // Ορίστε το στοιχείο στη θέση θέση σε τιμή
δημόσιο σύνολο κενών (int pos, int value) { }
    //Διαγραφή της πρώτης εμφάνισης του κλειδιού λέξης-κλειδιού
δημόσιο κενό αφαίρεση(int toRemove) { }
   // Λάβετε το μήκος του πίνακα ακολουθιών
public int size() { return 0; }
    //Εκκαθάριση του πίνακα ακολουθιών
δημόσιο κενό καθαρό() { }
   
   //Εκτύπωση πίνακα ακολουθιών
δημόσια προβολή κενού() { }
}

Στη συνέχεια, εφαρμόστε έναν πίνακα ακολουθιών τύπου int σύμφωνα με την παραπάνω μέθοδο:

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

Εισαγωγή στο ArrayList

Στο πλαίσιο συλλογής, το ArrayList είναι μια συνηθισμένη κλάση που υλοποιεί τη διεπαφή λίστας Το συγκεκριμένο διάγραμμα πλαισίου είναι το εξής:

  • Το ArrayList υλοποιείται με γενικό τρόπο και πρέπει να δημιουργηθεί πριν από τη χρήση.
  • Το ArrayList υλοποιεί τη διεπαφή RandomAccess, υποδεικνύοντας ότι το ArrayList υποστηρίζει τυχαία πρόσβαση
  • Το ArrayList υλοποιεί τη διεπαφή Cloneable, υποδεικνύοντας ότι το ArrayList μπορεί να κλωνοποιηθεί
  • Το ArrayList υλοποιεί τη διεπαφή Serializable, υποδεικνύοντας ότι το ArrayList υποστηρίζει τη σειριοποίηση
  • Σε αντίθεση με το Vector, το ArrayList δεν είναι ασφαλές για νήματα και μπορεί να χρησιμοποιηθεί σε ένα μόνο νήμα, μπορείτε να επιλέξετε Vector ή
  • CopyOnWriteArrayList
  • Το κάτω επίπεδο του ArrayList είναι ένας συνεχής χώρος και μπορεί να επεκταθεί δυναμικά Είναι μια δυναμικά πληκτρολογημένη λίστα ακολουθιών.

Πώς να χρησιμοποιήσετε το ArrayList

Κατασκευαστής ArrayList

Μέθοδος κατασκευής στο ArrayList:

ArrayList(); //Χωρίς κατασκευή παραμέτρων

ArrayList(Συλλογή<? extends E> γ) //Χρησιμοποιήστε άλλες Συλλογές για τη δημιουργία ArrayList

ArrayList(int initialCapacity) //Καθορίστε την αρχική χωρητικότητα του πίνακα ακολουθιών

Παράδειγμα κώδικα:

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

Συνήθεις λειτουργίες στο ArrayList

ουρά βύσμα

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

Εισαγάγετε το στοιχείο στην καθορισμένη θέση

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

Τερματισμός εισαγωγής στοιχείων από άλλη λίστα ακολουθιών

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

Διαγράψτε το στοιχείο στην καθορισμένη θέση

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

Διαγραφή καθορισμένων δεδομένων

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

Αποκτήστε το στοιχείο στην καθορισμένη θέση

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

Ορίζει το στοιχείο στην καθορισμένη θέση σε νέα δεδομένα

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

Εκκαθάριση λίστας ακολουθιών

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

Προσδιορίστε εάν ένα στοιχείο βρίσκεται στη λίστα ακολουθιών

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

Επιστρέφει το ευρετήριο του πρώτου καθορισμένου στοιχείου

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

Επιστρέφει το ευρετήριο του τελευταίου καθορισμένου στοιχείου

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

Κλείστε μέρος της λίστας

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

Τρεις τρόποι για να διασχίσετε το ArrayList

Το ArrayList μπορεί να διασχιστεί με τρεις τρόπους: για βρόχο + δείκτη, foreach ενισχυμένο βρόχο και χρησιμοποιώντας επαναλήπτες

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

αποτέλεσμα λειτουργίας:

Χρήση σεναρίου του ArrayList

Αλγόριθμος ανακάτεμα

Ανακατέψτε μια τράπουλα τυχαία και μοιράστε τα σε τρία άτομα, το καθένα με πέντε χαρτιά.

Η θέση του αρχικού κώδικα του αλγορίθμου:

τυχαίες κάρτες · Παραδείγματα Always Freshwater Fish/Java Classic - Code Cloud - Open Source China (gitee.com)

τρίγωνο Yang Hui

Περιγραφή θέματος:

Κώδικας:

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

Εκτελούμενο γράφημα αποτελεσμάτων: