2016-08-16 14 views
0

下面的代碼:通用單鏈接名錄 - 不兼容的類型

import java.util.Scanner; 

public class singlyyyyyy<E>{ 

    class Node<E>{ 
     private E element; 
     private Node<E> next; 

     public Node(E e, Node<E> n){ 
     element = e; 
     next = n; 
     } 

     public E getElement(){ 
     return element; 
     } 

     public Node<E> getNext(){ 
     return next; 
     } 

     public void setNext(Node<E> n){ 
     next = n; 
     } 
    } 

    private Node<E> head = null; 
    private Node<E> tail = null; 
    int size = 0; 

    public int size(){ 
     return size; 
    } 

    public boolean isEmpty(){ 
     return size == 0; 
    } 

    public E first(){ 
     if(isEmpty()) 
     return null; 

     return head.getElement(); 
    } 

    public E last(){ 
     if(isEmpty()) 
     return null; 

     return tail.getElement(); 
    } 

    public void addFirst(E e){ 
     head = new Node<>(e, head); 
     if(size == 0) 
     tail = head; 
     size++; 
    } 

    public void addLast(E e){ 
     Node<E> newNode = new Node<>(e, null); 
     if(isEmpty()) 
     head = newNode; 
     else 
     tail.setNext(newNode); 
     tail = newNode; 
     size++; 
    } 

    public E removeFirst(){ 
     if(isEmpty()) 
     return null; 
     E a = head.getElement(); 
     head = head.getNext(); 
     size--; 

     if(size == 0) 
     tail = null; 
     return a; 
    } 

    @Override 
    public String toString() { 
    StringBuilder buf = new StringBuilder(); 
    buf.append('['); 
    if (!isEmpty()) { 
     buf.append(head.getElement()); 
     Node<E> nodeRef = head.getNext(); 
     while (nodeRef != null) { 
      buf.append(", "); 
      buf.append(nodeRef.getElement()); 
      nodeRef = nodeRef.getNext(); 
     } 
    } 
    buf.append(']'); 
    return buf.toString(); 
    } 

    public void invoke(){ 
     Scanner scan = new Scanner(System.in);  
     singlyyyyyy<E> node = new singlyyyyyy<>(); 
     E e; 
     System.out.print("Enter size : "); 
     node.size(); 
     System.out.println("----------Menu----------"); 
     System.out.println("1. Add First Element "); 
     System.out.println("2. Add Last Element  "); 
     System.out.println("3. Remove First   "); 
     System.out.println("4. Display    "); 
     System.out.println("0. Terminate Program "); 
     System.out.println("------------------------"); 
     int choice = scan.nextInt(); 

    switch(choice){ 
     case 1: 
     E put; 
     System.out.println("Add first element: "); 
     put = scan.next(); 
     node.addFirst(put); 
     break; 
     case 2: 
     E pin; 
     System.out.println("Add last element: "); 
     pin = scan.next(); 
     node.addFirst(pin); 
     break; 
     case 3: 
     node.removeFirst(); 
     break; 
     case 4: 
     System.out.print(node); 
     break; 
     case 0: 
     System.out.println("\nProgram Terminated.\n"); 
     break; 
     } 
    } 
} 

class Main{ 

    public static void main(){ 

     singlyyyyyy<Integer> singly = new singlyyyyyy<Integer>(); 

     singly.invoke(); 
    } 
} 

我明白提示用戶時,輸入一個因素,因爲E是通用的,scan.next();僅用於對象和字符串我不能使用scan.next();。我已考慮解析putpinint,但addFirst()addLast()只接受E

+2

讀取用戶輸入應該不在名單內,但在'主要進行() '方法,並且由於您定義'singly'以使用泛型類型'Integer',只需從用戶輸入創建'Integer'實例。除此之外,請檢查Java代碼規範中關於命名的提示(類名稱應以大寫字母開頭等)。 - 更準確地說,在第一部分中:方法'invoke'()'不應該成爲任何列表/節點實例的一部分。 – Thomas

+0

歡迎來到「upvote level」btw ;-) – GhostCat

回答

0

你的問題是,你想要泛型類,但在它內部,你知道你想要的類型參數。你有兩個選擇:讓你的類不是通用的,或者提供一個工具來處理它的內容,而不需要任何關於它的知識。

第一種方式是存在的。

要實現其次,您可以創建一個接口,其中包含您需要使用元素的所有方法。就像這樣:

interface Worker<E> { 
    E convertFromString(String s); 
    String convertToString(E e); 
} 

然後通過實施thisinterface您singlyyyyyy類YSE opropriate方法時,你需要處理E