2017-02-14 4 views
1

Ich habe eine Inventory Management App erstellt, in der der Benutzer Daten aus dem Inventar hinzufügen, anzeigen und löschen kann. Wenn der Benutzer A eingibt, fordert das Programm den Benutzer auf, Daten einzugeben. Wenn der Benutzer D eingibt, zeigt das Programm die Daten im Inventar an. Ich verwende LinkedList, um dies zu erreichen. Ich bin ziemlich neu dazu. Ich konnte Benutzer zur Eingabe von Daten auffordern, konnte sie jedoch nicht anzeigen. Es gibt eine rote Linie auf dem Code. Wo bin ich falsch gelaufen? Es tut mir leid, wenn die Art, wie ich frage, falsch ist. Korrigiere mich.Java LinkedList zur Anzeige von Daten

Main.java

public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 

     int t = 0; 

     LinkedList myList = new LinkedList(); 

     while(t != 1) 
     { 
      System.out.print("I, A, D"); 
      char input = sc.next().charAt(0); 


      if(input == 'A') 
      { 
       System.out.print("Please enter item id: "); 
       int id = sc.nextInt(); 
       sc.nextLine(); 

       System.out.print("Please enter item name: "); 
       String name = sc.nextLine(); 

       System.out.print("Please enter item type: "); 
       String type = sc.nextLine(); 

       System.out.print("Please enter item price: "); 
       double price = sc.nextDouble(); 
       sc.nextLine(); 

       Item I1 = new Item(id, name, type, price); 
       myList.addItemToFront(I1); 
      } 

      else if(input == 'D') 
      { 
       myList.DisplayItem(); //at this point, theres red line which i dont know why? 
      } 
     } 

LinkedList.java

class LinkedList { 

    private Node head; // first node in the linked list 
    private int count; 

    public int getCount() { 
     return count; 
    } 

    public Node getHead() { 
     return head; 
    } 

    public LinkedList() { 
     head = null; // creates an empty linked list 
     count = 0; 
    } 

    public void addFront(int n) { 
     Node newNode = new Node(n); 

     newNode.setLink(head); 
     head = newNode; 

     count++; 
    } 

    public void deleteFront() { 
     if (count > 0) { 
      head = head.getLink(); 
      count--; 
     } 
    } 

    public void addItemToFront(Item I1) 
    { 
     Node itemNode = new Node(I1); 
     itemNode.setLink(head); 
     head = itemNode; 
    } 

    public void DisplayItem(Node head) 
    { 
     if(head == null) 
     { 
      return; 
     } 

     Node current = head; 

     while (current != null) 
     { 
      System.out.println(current.data.toString()); 
      current = current.getLink(); 
     } 

     System.out.println(current); 
    } 

    public int length(Node head) 
    { 
     if(head == null) 
     { 
      return 0; 
     } 

     int count = 0; 
     Node current = head; 
     while(current != null) 
     { 
      count++; 
      current = current.getLink(); 
     } 
     return count; 
    } 

Node.java

public class Node { 

    Object data; 
    private Node link; 

    public Object getData() { 
     return data; 
    } 

    public void setData(Object data) { 
     this.data = data; 
    } 

    public Node getLink() { 
     return link; 
    } 

    public void setLink(Node link) { 
     this.link = link; 
    } 

    public Node(Object data) { 
     this.data = data; 
     this.link = null; 
    } 
} 

Beispielausgabe

I, A, D 

A 

Please enter item id: 001 

Please enter item name: Wooden Chair 

Please enter item type: Furniture 

Please enter item price: 50.30 

I, A, D 

D 

001, Wooden Chair, Furniture, 50.30 
+0

„_But war it_ nicht in der Lage, um“ - würde helfen, wenn Sie in vollem Umfang die Eingabe und erwartete Ausgabe beschrieben. –

+0

Es tut mir leid. Ganz neu dazu. Ich habe den Beitrag entsprechend bearbeitet. –

+0

Sie können auch die Node-Klasse hochladen. Und auch eine empfohlene Praxis ist, die LinkedList-Klasse Generic für Typ Sicherheit zu machen, indem Sie die folgenden 'Klasse LinkedList ' und machen die Knoten-Klasse allgemeiner. –

Antwort

1
public void DisplayItem() { 
    if (head == null) { 
     return; 
    } 

    Node current = head; 

    while (current != null) { 
     System.out.println(current.getNodeItem().toString()); 
     current = current.getLink(); 
    } 
} 

Verwenden Sie diese Methode

+0

Vielen Dank für die ausführliche Erklärung! Ja es funktioniert. Schätze es sehr! –

0

Wie ich in LinkedList.java Klasse sehen Ihre Löschmethode der Knoten Kopf, um es werden erwartet übergeben (wie das Programm beispielsweise ausgeführt werden soll), bevor es laufen kann. Sie müssen dann den Kopfknoten an Ihre Darstellungsmethode übergeben.

Ich würde erwarten, dass es ein Compilerfehler in Ihrem Main.java ist, wenn Sie den richtigen Code oben gesetzt haben.

+0

Vielen Dank für den Hinweis auf meinen Fehler. Kannst du mir erklären, warum das wichtig ist? Ich dachte, die Methode ist nur das, was der Main abruft, ohne die Platzierung des Codes zu berücksichtigen? Dein Rat wird mir definitiv helfen. –

+0

In einer Java-Klasse kann es viele Overloaded-Methoden geben, z. B. DisplayItem(), DisplayItem (Node-Kopf), DisplayItem (Node-Kopf, String toAppend) usw. JVM muss genau wissen, wie der Client-Code aufgerufen werden soll - und daher ist die Signatur einer Methode wichtig. Hoffe, das macht die Dinge für dich klarer. – PankajT

0

Die Anzeigemethode in Ihrer verknüpften Listenklasse akzeptiert ein Argument vom Typ node, das den Kopf darstellt. Sie müssen dieses Argument von der Hauptmethode übergeben, dann wird es funktionieren. Statt: myList.DisplayItem(); Tun Sie dies: myList.DisplayItem (head); Wenn Sie nun Ihre LinkedList-Klasse verwenden, haben Sie den "Kopf" als private Variable definiert, entweder öffentlich gemacht, so dass Sie von der Main-Klasse darauf zugreifen können, oder Sie können das Argument aus dem DisplayItem entfernen (Nodes head)) Methode, weil Sie den Kopf als globale Variable verwenden und dann in der DisplayItem-Methode darüber iterieren. Also, besser das Argument aus der Methodendefinition entfernen, es wird funktionieren.

+0

kein Parameter an DisplayItem übergeben. Das LinkedList-Objekt hat einen Head-Wert, und DisplayItem kann direkt darauf zugreifen. – IfOnly

+0

Ok. Ich habe verstanden, was du meinst. Aber es gab mir immer noch eine rote Linie, wenn ich den Kopf addiere. Es fragt mich, ich sollte den variablen Kopf erstellen, den ich nicht verstehe, warum? Sollte der Kopf nicht von der verknüpften Liste abrufen? Fehle ich etwas? –

+0

@HakimBajuri: Mit welchem ​​Problem sind Sie genau konfrontiert? an welcher Linie. Ich sehe nur DisplayItem Funktionsproblem. – IfOnly

Verwandte Themen