我正在尝试创建一个循环 LinkedList 请告诉我它是否是正确的方法
I am trying to create a circular LinkedList Please tell me if its a correct way to do it
我已经实现了逻辑,比如如果我给出一个还不存在的索引,那么它会将索引更改为提醒(我猜与旋转相同)。
import java.util.LinkedList;
public class MycircularlinkedList extends LinkedList {
private static int count = 0;
public Object get(int i) {
System.out.println("count==" + count);
if (i > count) {
i = i % count;
return super.get(i);
} else {
return super.get(i);
}
}
public boolean add(Object o) {
super.add(o);
count++;
return true;
}
public void add(int i, Object o) {
if (i > count)
i = i % count;
super.add(i, o);
count++;
}
}
我能看到的几点:
count
是静态的,这意味着您在这里只会有一个数字。可能不是你想要的
count
多余,使用Collection#size()
- mod (
%
) 的伟大之处在于它适用于所有数字,您不需要有条件。 2 % 12 == 14 % 12 == -10 % 12
- 如果您要摆脱
count
属性,您可以摆脱覆盖的 #add(Object o)
逻辑,只需执行 return super.add(o);
你很接近。
(1) 众所周知,术语“circular linked list”表示尾部链接回头部的列表(反之亦然,如果它是双向链表)。你的更像是一个存储在链表中的 "circular buffer"。我们可以称它为 LinkedListCircularBuffer
或其他名称。
(2) class 应由元素类型参数化,因此
public class LinkedListCircularBuffer<E> extends LinkedList<E> {
@Override
public E get(int i) {
return super.get(i % size()); // simpler and faster without an "if"
}
}
(3)可以调用size()
代替所有的代码维护另一个count
.
(4) 您的 add(int i, Object o)
方法不支持 i == size()
的情况,但您可以通过根本不覆盖 add()
来解决这个问题。
(5) 覆盖的方法需要 @Override
注释。
(6) 总是 在每个 "then" 和 "else" 子句周围放置大括号是一种很好的风格。代码如
if (i > count)
i = i % count;
易碎,例如在 "then" 子句中添加 println()
语句会破坏它。
我发现您的代码存在一些问题:如果 count ==0 并且如果我使用方法 add(7,obj) ,则 7%0 将抛出 ArithmeticException.count 应该声明为私有,因为您可能你的 class.Also 有两个实例,你需要检查
poll\offerLast 方法是否满足您的需求,因为您不能限制
避免使用 them.Finally、clone\readObject\writeObject 的任何客户端代码
需要覆盖以包含计数变量。
我已经实现了逻辑,比如如果我给出一个还不存在的索引,那么它会将索引更改为提醒(我猜与旋转相同)。
import java.util.LinkedList;
public class MycircularlinkedList extends LinkedList {
private static int count = 0;
public Object get(int i) {
System.out.println("count==" + count);
if (i > count) {
i = i % count;
return super.get(i);
} else {
return super.get(i);
}
}
public boolean add(Object o) {
super.add(o);
count++;
return true;
}
public void add(int i, Object o) {
if (i > count)
i = i % count;
super.add(i, o);
count++;
}
}
我能看到的几点:
count
是静态的,这意味着您在这里只会有一个数字。可能不是你想要的count
多余,使用Collection#size()
- mod (
%
) 的伟大之处在于它适用于所有数字,您不需要有条件。2 % 12 == 14 % 12 == -10 % 12
- 如果您要摆脱
count
属性,您可以摆脱覆盖的#add(Object o)
逻辑,只需执行return super.add(o);
你很接近。
(1) 众所周知,术语“circular linked list”表示尾部链接回头部的列表(反之亦然,如果它是双向链表)。你的更像是一个存储在链表中的 "circular buffer"。我们可以称它为 LinkedListCircularBuffer
或其他名称。
(2) class 应由元素类型参数化,因此
public class LinkedListCircularBuffer<E> extends LinkedList<E> {
@Override
public E get(int i) {
return super.get(i % size()); // simpler and faster without an "if"
}
}
(3)可以调用size()
代替所有的代码维护另一个count
.
(4) 您的 add(int i, Object o)
方法不支持 i == size()
的情况,但您可以通过根本不覆盖 add()
来解决这个问题。
(5) 覆盖的方法需要 @Override
注释。
(6) 总是 在每个 "then" 和 "else" 子句周围放置大括号是一种很好的风格。代码如
if (i > count)
i = i % count;
易碎,例如在 "then" 子句中添加 println()
语句会破坏它。
我发现您的代码存在一些问题:如果 count ==0 并且如果我使用方法 add(7,obj) ,则 7%0 将抛出 ArithmeticException.count 应该声明为私有,因为您可能你的 class.Also 有两个实例,你需要检查 poll\offerLast 方法是否满足您的需求,因为您不能限制 避免使用 them.Finally、clone\readObject\writeObject 的任何客户端代码 需要覆盖以包含计数变量。