带有数组String的DoubleLinkedList具有Node的通用元素

时间:2014-11-13 23:45:05

标签: java generics

我有一个带有一个元素的双链接节点,我将这个类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;

   }
}

2 个答案:

答案 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>>