Compartilhamento de tecnologia

[Estrutura de dados Java] Uma das primeiras tabelas lineares: tabela sequencial

2024-07-12

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

Implementação simples de uma tabela de sequência usando Java

Uma tabela de sequência é uma estrutura linear que usa uma unidade de armazenamento com um endereço físico contínuo para armazenar elementos de dados em sequência. Geralmente, é usado armazenamento em array. Conclua a adição, exclusão, verificação e modificação de dados no array.

As tabelas lineares geralmente incluem os seguintes métodos:

classe pública MyArrayList {
matriz privada int[];
tamanho int privado;
   //O método de construção padrão aloca espaço por padrão
Lista de sequências(){ }
    // Define a capacidade subjacente da tabela de sequência para a capacidade especificada
SeqList(int capacidade de inicialização){ }

   //Adiciona novos elementos, por padrão eles são adicionados no final do array
público void add(int dados) { }
    //Adiciona elemento na posição pos
público void add(int pos, int dados) { }
   // Determina se um elemento está contido
público booleano contém(int toFind) { return true; }
    //Encontre a posição correspondente a um elemento
público int indexOf(int toFind) { return -1; }
    // Obtém o elemento na posição pos
público int obter(int pos) { retornar -1; }
   // Define o elemento na posição pos para valor
público void set(int pos, int valor) { }
    //Exclui a primeira ocorrência da palavra-chave key
público vazio remove(int paraRemover) { }
   //Obtém o comprimento da tabela de sequência
público int tamanho() { retornar 0; }
    //Limpa a tabela de sequência
público vazio limpar() { }
   
   //Imprime tabela de sequência
público void display() { }
}

A seguir, implemente uma tabela de sequência do tipo int de acordo com o método acima:

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

Introdução ao ArrayList

Na estrutura de coleção, ArrayList é uma classe comum que implementa a interface List. O diagrama da estrutura específica é o seguinte:

  • ArrayList é implementado de maneira genérica e deve ser instanciado antes do uso.
  • ArrayList implementa a interface RandomAccess, indicando que ArrayList suporta acesso aleatório
  • ArrayList implementa a interface Cloneable, indicando que ArrayList pode ser clonado
  • ArrayList implementa a interface Serializable, indicando que ArrayList suporta serialização
  • Ao contrário do Vector, ArrayList não é thread-safe e pode ser usado em um único thread. Em multithreads, você pode escolher Vector ou.
  • CopiarNaGravaçãoArrayList
  • A camada inferior de ArrayList é um espaço contínuo e pode ser expandido dinamicamente. É uma lista de sequências digitada dinamicamente.

Como usar ArrayList

Construtor ArrayList

Método construtor em ArrayList:

ArrayList(); //Sem construção de parâmetro

ArrayList(Coleção<? extends E> c); //Use outras coleções para construir ArrayList

ArrayList(int inicialCapacity); //Especifique a capacidade inicial da tabela de sequência

Exemplo de código:

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

Operações comuns em ArrayList

plugue de cauda

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

Inserir elemento na posição especificada

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

Finalizar inserção de elementos de outra lista de sequência

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

Exclua o elemento na posição especificada

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

Excluir dados especificados

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

Obtenha o elemento na posição especificada

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

Define o elemento na posição especificada para novos dados

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

Limpar lista de sequências

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

Determinar se um elemento está na lista de sequências

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

Retorna o índice do primeiro elemento especificado

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

Retorna o índice do último elemento especificado

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

Interceptar parte da lista

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

Três maneiras de percorrer ArrayList

ArrayList pode ser percorrido de três maneiras: for loop + subscript, foreach loop aprimorado e usando iteradores

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

resultado da operação:

Cenário de uso de ArrayList

Algoritmo de embaralhamento

Embaralhe aleatoriamente um baralho de cartas e distribua-o entre três pessoas, cada uma com cinco cartas.

A localização do código original do algoritmo:

shufflecards · Sempre exemplos clássicos de peixes de água doce/Java - Code Cloud - Open Source China (gitee.com)

Triângulo Yang Hui

Descrição do tópico:

Código:

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

Gráfico de resultados em execução: