我已经实现了逻辑,如果我给的索引还没有那么它会将索引更改为提醒(就像我想的那样旋转)。
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++;
}
}
答案 0 :(得分:1)
我可以看到几点:
count
是静态的,这意味着您只会在这里拥有一个号码。可能不是你想要的东西count
是多余的,请使用Collection#size()
%
)的好处是它适用于所有数字,你不需要有条件。 2 % 12 == 14 % 12 == -10 % 12
count
属性,则可以摆脱被覆盖的#add(Object o)
逻辑并执行return super.add(o);
答案 1 :(得分:1)
我发现你的代码存在一些问题:如果count == 0并且我使用方法add(7,obj),那么7%0会抛出ArithmeticException.count应该声明为private,因为你可能有两个实例你的班级。还需要检查 poll \ offerLast方法是否满足您的需求,因为您无法限制 任何客户端代码都要避免使用它们。最后,克隆\ readObject \ writeObject 需要被夸大以包括计数变量。
答案 2 :(得分:0)
你关闭了。
(1)术语" circular linked list"众所周知,尾部链接到头部的列表(反之亦然,如果它是双向链表)。你的更像是一个循环缓冲区"存储在链表中。我们可以称之为LinkedListCircularBuffer
或其他东西。
(2)该类应该由元素类型参数化,因此
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)始终在每个&#34;然后&#34;周围放置大括号的好风格和&#34;否则&#34;条款。代码如
if (i > count)
i = i % count;
很脆弱,例如在{&#34;然后&#34;中添加println()
语句条款将打破它。