我有一个带有一个元素的双链接节点,我将这个类DNode
实现到我的DoubleLinkedList
类。
我已设置好所有内容,但我想创建一个DoubleLinkedList
,其中E
元素为String[2]
。我怎么能这样做?
我想做这样的事情:
package pt.ips.pa.model.modelo;
import pt.ips.pa.model.tads.DoubleLinkedList;
public class Ranking {
private DoubleLinkedList<String[]> ranking;
public Ranking() {
this.ranking = new DoubleLinkedList<>();
}
}
DNode
课程是:
package pt.ips.pa.model.tads;
public class DNode<E> {
private DNode<E> prev, next;
private E elem;
public DNode(E elem, DNode<E> prev, DNode<E> next) {
this.elem = elem;
this.prev = prev;
this.next = next;
}
public DNode<E> getPrev() {
return prev;
}
public void setPrev(DNode<E> prev) {
this.prev = prev;
}
public DNode<E> getNext() {
return next;
}
public void setNext(DNode<E> next) {
this.next = next;
}
public E getElem() {
return elem;
}
public void setElem(E elem) {
this.elem = elem;
}
}
这是DoubleLinkedList
类:
package pt.ips.pa.model.tads;
public class DoubleLinkedList<E> implements List<E> {
private DNode<E> header;
private DNode<E> trailer;
private int size;
public DoubleLinkedList() {
this.header = new DNode<>(null, null, null);
this.trailer = new DNode<>(null, header, null);
this.header.setNext(trailer);
this.size = 0;
}
@Override
public int size() {
return this.size;
}
@Override
public boolean isEmpty() {
return this.size == 0;
}
@Override
public E get(int r) throws OutofBoundsException {
if (r < 0 || r >= this.size) {
throw new UnsupportedOperationException("Not supported yet.");
}
return nodeAtRank(r).getElem();
}
@Override
public E set(int r, E elem) throws OutofBoundsException {
if (r < 0 || r >= this.size) {
throw new UnsupportedOperationException("Not supported yet.");
}
DNode<E> nodeAux = nodeAtRank(r);
E elemAux = nodeAux.getElem();
nodeAux.setElem(elem);
return elemAux;
}
@Override
public E remove(int r) throws OutofBoundsException {
if (r < 0 || r >= size) {
throw new OutofBoundsException(r);
}
DNode<E> aux = nodeAtRank(r);
E elem = aux.getElem();
DNode<E> prev = aux.getPrev();
DNode<E> next = aux.getNext();
prev.setNext(next);
next.setPrev(prev);
size--;
return elem;
}
@Override
public void add(int r, E elem) throws OutofBoundsException {
if (r < 0 || r > size) {
throw new OutofBoundsException(r);
}
DNode<E> aux = nodeAtRank(r);
DNode<E> prev = aux.getPrev();
DNode<E> newNode = new DNode<>(elem, prev, aux);
aux.setPrev(newNode);
prev.setNext(newNode);
size++;
}
private DNode<E> nodeAtRank(int r) throws OutofBoundsException {
DNode<E> nodeAux = header.getNext();
for (int i = 0; i < r; i++) {
nodeAux = nodeAux.getNext();
}
return nodeAux;
}
}
答案 0 :(得分:0)
以下是执行此操作的代码:
DoubleLinkedList<String[]> ranking = new DoubleLinkedList<String[]>;
DNode<String[]> node = new DNode<String[]>(new String[2], null, null);
ranking.add(0, node);
我还建议在DNode中添加第二个构造函数,它只接受E元素作为参数,并且还将一个append方法接受到将元素置于跟踪位置的列表类,然后代码将简化为:
DoubleLinkedList<String[]> ranking = new DoubleLinkedList<String[]>;
DNode<String[]> node = new DNode<String[]>(new String[2]);
ranking.append(node);
另外,正如David Conrad所说,Java不允许使用泛型来限制数组的大小。通用类型基本上在编译后被擦除,并且在运行时不存在。任何人都可以在运行时使用您的类DoubleLinkedList,并添加包含更大尺寸的字符串数组的新DNode。
如果你真的想限制底层数组的大小,你必须更改DoubleLinkedList中的代码来执行(e.size&lt; = 2)检查e是否是数组类型。如果你真的想这样做,请在评论中告诉我,我会告诉你它的代码。但它不是一个干净的解决方案,最好有一个非通用的专用列表,它只接受String []作为类型并执行边界检查。
答案 1 :(得分:0)
您可以使用java.util.Pair
代替String[2]
。否则,您将不得不忍受String[]
。
DoubleLinkedList<Pair<String, String>>