Как создать связанный список с окончательным экземпляром списка - PullRequest
2 голосов
/ 22 июня 2019

Я тренирую свои навыки Java и в настоящее время работаю над реализацией собственного связного списка. Здесь я хочу создать связанный список, в который вы не можете добавлять или удалять элементы списка. К сожалению, я все еще могу добавить Listitems.

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

public class ListElement {
    private int data;
    private ListElement nextElement;
}

public class List {
    private ListElement first = null;

    public List() {
        first = null;
    }
    public static List randomList(int numListElements) {
        List list = new List();
        for(int i = 0; i < numListElements; i++)
        {
            list.add((int) ((Math.random() * 100) + 1));
        }
        return list;
    }
    public void add(int d1) {
        if(first == null)
        {
            first= new ListElement(d1);
            return;
        }
        ListElement currentLink = first;
        while(currentLink.getNextElement() != null)
        {
            currentLink = currentLink.getNextElement();
        }
        currentLink.setNextElement(new ListElement(d1));
    }
}

public class Listentest {
    public static void main(String[] args) {
        final List list = List.randomList(3);
        System.out.println(list.toString());
        list.add(5);
        System.out.println(list.toString());
    }
}

В первом выводе я получаю 3 элемента. Во втором выводе я получаю 4 элемента. Я хочу, чтобы вывод был таким же ..

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Одной из возможностей может быть создание отдельного класса, который создает список unmodifiable. Вы передаете исходный список конструктору, и он возвращает новый список, который не содержит метод add, но все же позволяет перечислять элементы.

Одним из преимуществ этого является то, что если вам когда-либо понадобится создать второй или третий список с дополнительными элементами, вы можете добавить их к оригиналу и затем создать новый список unmodifiable.

1 голос
/ 22 июня 2019

Вы добавляете логическое поле к списку классов, возможно, с именем allowModification . Первоначально это поле имеет значение true, но вы добавляете метод, который может называться seal () , в ваш класс, который меняет это поле на false.

И затем все ваши методы, которые могли бы изменить список, просто проверяют это поле. Если это правда, они делают то, что должны, в противном случае они могут выдать исключение, сообщающее пользователю, что изменения не разрешены для запечатанных списков.

Другим подходом может быть определение особого экземпляра класса вашего узла. И когда вызывается seal (), у вас есть последний элемент в списке, указывающий на это специальное значение вместо нуля для отметки: добавление других элементов больше не допускается. Но решение, основанное на этом флаге, менее сложное.

С учетом комментария ОП: реальное решение работает по-другому: у вас в основном есть список, который позволяет вносить изменения постоянно. И тогда у вас есть отдельный список имплантации, который нельзя изменить после его первоначального создания. Вы создаете этот список на основе другого списка, он выбирает содержащиеся в нем элементы, а затем просто отказывается от каких-либо изменений.

И нет, класс списка не может знать, помечены ли его экземпляры как окончательные!

...