У вас может быть список ArrayList, содержащий односвязные списки?

#java #arraylist #singly-linked-list

Вопрос:

Я пытаюсь создать список массивов, содержащий односвязный список в каждом индексе. Список вывода, который я пытаюсь создать, будет содержать односвязные списки, содержащие строки, которые отсортированы (сейчас сортировка не имеет значения, если я не могу ввести переменные в односвязные списки, а SLL-в список массивов). Мне любопытно, можно ли добавить односвязные списки в ArrayLists.

 SinglyLinkedList sList = new SinglyLinkedList();
ArrayList<String> outputList = new ArrayList<String>();
            int size = inputList.size();
            for(int i = 0;i < (size-1);i  ) {
                if(i==0) {
                    outputList.add(sList.addNode(inputList.get(i)));
                }
            }
 

InputList-это список массивов, содержащий строки.

Однолинейный список определяется приведенным ниже кодом.

 public class SinglyLinkedList {

//From: https://www.javatpoint.com/java-program-to-create-and-display-a-singly-linked-list
class Node{
    String data;
    Node next;
    
    public Node(String data) {
        this.data = data;
        this.next = null;
    }
}

public Node head = null;
public Node tail = null;

public void addNode(String data) {
    
    Node newNode = new Node(data);
    
    if(head == null) {
        head = newNode;
        tail = newNode;
    }
    else {
        tail.next = newNode;
        tail = newNode;
    }
}

public void display() {
    Node current = head;
    
    if(head == null) {
        System.out.println("List is Empty/Null");
        return;
    }
    
    System.out.println("Nodes of this singly linked list are: ");
    while(current != null) {
        System.out.print(current.data   " ");
        current = current.next;
    }
    System.out.println();
}
 

Как следует из ответа, который я использовал;

 List<List<String>> outputList = new ArrayList<>();
List<String> singleList = (List<String>) new SinglyLinkedList();
 

Однако вторая строка выдает ошибку во время выполнения,

 Exception in thread "main" java.lang.ClassCastException: class SinglyLinkedList cannot be cast to class java.util.List (SinglyLinkedList is in unnamed module of loader 'app'; java.util.List is in module java.base of loader 'bootstrap')
    at SinglyLinkedList.main(SinglyLinkedList.java:89)
 

Комментарии:

1. Краткий комментарий с мобильного, не полный ответ: Все, что не является примитивным типом (например, boolean, char, int), может быть сохранено в списке массивов соответствующего типа. Здесь правильный тип списка массивов, вероятно, будет ArrayList<SinglylinkedList> или похожим.

2. Вы можете добавить любой тип объекта в список объектов, если вы правильно работаете с ними. Наличие списка ArrayList, объявленного как ArrayList<String> , а затем попытка добавить SinglyLinkedList туда экземпляры не имеет смысла, особенно если вы делаете это с помощью sList.addNode(inputList.get(i)) , который ничего не возвращает.

Ответ №1:

ArrayList может содержать любой объект, который включает SinglyLinkedList в себя . Например, если вы хотите иметь ArrayList с 3 элементами:

 List<SinglyLinkedList> outputList = new ArrayList<>();
for (int i = 0; i < 3; i  ) {
   outputList.add(new SinglyLinkedList());
}
 

Ответ №2:

Да, список может содержать любой тип класса. Однако указание класса реализации с левой стороны обычно не одобряется, поскольку оно навязывает тип реализации, когда все, что вам обычно нужно, — это интерфейс. Если вы сами реализуете односвязный список, я настоятельно рекомендую вам сделать это в интерфейсе списка. Тогда вы сделали бы что-то вроде:

 List<List<String>> myList = new ArrayList<>()
List<String> singleList = new SinglyLinkedList<>();
singleList.add("new data");
myList.add(singleList);
 

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

Изменить: Ваш класс с одним связанным списком должен выглядеть следующим образом:

 public class SingleLinkedList<T> implements List<T> {

    class Node {
        T data;
        Node next;
    
        public Node(T data) {
            this.data = data;
            this.next = null;
        }
    }

//implement all of the List interface methods
}
 

Если вы сделаете это, ваш класс теперь будет придерживаться стандартов Списка.

Комментарии:

1. Когда я это реализую, возникает ошибка со строкой List<String>. ‘класс SinglyLinkedList не может быть приведен к классу java.util. Список (однолинейный список находится в безымянном модуле загрузчика «приложение»; java.util. Список находится в модуле java.база загрузчика ‘bootstrap’)’ Не знаю, почему, но это может иметь какое-то отношение к <> после «новый список с одной ссылкой»

2. Вы упоминаете «сделайте это в интерфейсе списка». Есть ли у вас какие-либо ссылки, которые помогли бы мне в этом отношении?

3. Обновлено, чтобы дать небольшое разъяснение.