如何使用列表的最终实例设计链表
How to design a linked list with a final instance of the list
我正在训练我的 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 个元素。我希望输出相同..
您将布尔字段添加到列表 class,可能命名为 allowModifications。最初,该字段为 true,但您向 class 添加一个可能称为 seal() 的方法,该方法将该字段更改为 false。
然后所有会更改列表的方法只需检查该字段。如果为真,则他们会做他们应该做的事情,否则他们会抛出异常,告诉用户密封列表不允许修改。
另一种方法是定义节点的特殊实例 class。当调用 seal() 时,列表中的最后一个元素指向该特殊值而不是 null 以标记:不再允许添加其他元素。但是基于该标志的解决方案不那么复杂。
考虑到 OP 的评论:现实世界的解决方案的工作方式不同:您基本上一直都有允许修改的列表。然后你是一个单独的列表植入,在其初始创建后无法修改。您基于另一个列表创建该列表,它获取其中的元素,然后简单地拒绝任何类型的修改。
不,列表 class 无法知道它自己的实例是否被标记为最终的!
一种可能性是创建一个单独的 class 来创建 unmodifiable
列表。您将原始列表传递给构造函数,它 returns 一个不包含 add
方法但仍允许您列出项目的新列表。
这样做的一个好处是,如果您需要创建第二个或第三个包含其他项目的列表,您可以将它们添加到原始列表中,然后创建一个新的 unmodifiable
列表。
我正在训练我的 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 个元素。我希望输出相同..
您将布尔字段添加到列表 class,可能命名为 allowModifications。最初,该字段为 true,但您向 class 添加一个可能称为 seal() 的方法,该方法将该字段更改为 false。
然后所有会更改列表的方法只需检查该字段。如果为真,则他们会做他们应该做的事情,否则他们会抛出异常,告诉用户密封列表不允许修改。
另一种方法是定义节点的特殊实例 class。当调用 seal() 时,列表中的最后一个元素指向该特殊值而不是 null 以标记:不再允许添加其他元素。但是基于该标志的解决方案不那么复杂。
考虑到 OP 的评论:现实世界的解决方案的工作方式不同:您基本上一直都有允许修改的列表。然后你是一个单独的列表植入,在其初始创建后无法修改。您基于另一个列表创建该列表,它获取其中的元素,然后简单地拒绝任何类型的修改。
不,列表 class 无法知道它自己的实例是否被标记为最终的!
一种可能性是创建一个单独的 class 来创建 unmodifiable
列表。您将原始列表传递给构造函数,它 returns 一个不包含 add
方法但仍允许您列出项目的新列表。
这样做的一个好处是,如果您需要创建第二个或第三个包含其他项目的列表,您可以将它们添加到原始列表中,然后创建一个新的 unmodifiable
列表。