Обмен технологиями

[Структура данных Java] Одна из первых линейных таблиц: последовательная таблица

2024-07-12

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

Простая реализация таблицы последовательностей с использованием Java

Таблица последовательности представляет собой линейную структуру, в которой для последовательного хранения элементов данных используется единица хранения с непрерывным физическим адресом. Обычно используется массив. Выполните добавление, удаление, проверку и изменение данных в массиве.

Линейные таблицы обычно включают следующие методы:

публичный класс MyArrayList {
частный массив int[];
частный размер int;
   //Метод построения по умолчанию выделяет пространство по умолчанию
SeqList(){ }
    // Устанавливаем базовую емкость таблицы последовательностей на указанную емкость
SeqList(int initcapacity){ }

   // Добавляем новые элементы, по умолчанию они добавляются в конец массива
public void add(целые данные) { }
    //Добавляем элемент в позицию позиции
public void add(int pos, int data) { }
   // Определяем, содержится ли элемент
public boolean содержит(int toFind) { return true; }
    // Находим позицию, соответствующую элементу
public int indexOf(int toFind) { return -1; }
    // Получаем элемент в позиции позиции
public int get(int pos) { return -1; }
   // Устанавливаем элемент в позиции pos в значение
public void set(int pos, int value) { }
    //Удаляем первое вхождение ключевого слова
public void удалить(int toRemove) { }
   // Получаем длину таблицы последовательности
public int size() { return 0; }
    //Очищаем таблицу последовательности
публичный void clear() { }
   
   //Печать таблицы последовательности
public void display() { }
}

Далее реализуем таблицу последовательности типа 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 — это обычный класс, реализующий интерфейс List. Конкретная диаграмма платформы выглядит следующим образом:

  • ArrayList реализован в общем виде и должен быть создан перед использованием.
  • ArrayList реализует интерфейс RandomAccess, указывая, что ArrayList поддерживает произвольный доступ.
  • ArrayList реализует интерфейс Cloneable, указывающий, что ArrayList можно клонировать.
  • ArrayList реализует интерфейс Serializable, указывая, что ArrayList поддерживает сериализацию.
  • В отличие от Vector, ArrayList не является потокобезопасным и может использоваться в одном потоке. В многопоточных режимах вы можете выбрать Vector или.
  • CopyOnWriteArrayList
  • Нижний уровень ArrayList представляет собой непрерывное пространство и может быть динамически расширен. Это список последовательностей динамического типа.

Как использовать ArrayList

Конструктор ArrayList

Метод конструктора в ArrayList:

ArrayList(); //Нет построения параметров

ArrayList(Коллекция<? extends E> c); //Используем другие коллекции для создания 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 можно перемещать тремя способами: цикл for + индекс, расширенный цикл 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

Алгоритм перетасовки

Перетасуйте колоду игральных карт в случайном порядке и раздайте их трем людям, по пять карт у каждого.

Расположение исходного кода алгоритма:

shufflecards · Always Freshwater Fish/Классические примеры Java – Облако кода – Китай с открытым исходным кодом (gitee.com)

Треугольник Ян Хуэй

Описание темы:

Код:

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

График результатов выполнения: