2016-11-22 6 views
0

Hi Ich brauche wirklich Hilfe mit meinem Programm, ich habe hoch und niedrig für eine Lösung gesucht, aber kann nicht finden, wonach ich suche.Vorherige Eingabe wird durch neuere Eingabe überschrieben

Ich mache ein Programm, wo der Benutzer einen Desktop hinzufügt, gibt verschiedene Informationen für ihn und dann wird es in einer Array-Liste hinzugefügt.

Hier ist der Code:

Intro:

Scanner scan = new Scanner(System.in); 
    String input; 
    boolean looper = true; 
    DecimalFormat f = new DecimalFormat("#.00"); 
    ArrayList<Desktop> desktopList = new ArrayList<>(); 
    ArrayList<Laptop> laptopList = new ArrayList<>(); 

    while (looper) { 
     System.out.println(""); 
     System.out.println("******************* Artificial Intelligence Co. *************************"); 
     System.out.println("1. Add Information for new Desktop"); 
     System.out.println("2. Add Information for new Laptop"); 
     System.out.println("3. Display all computer information"); 
     System.out.println("4. Quit"); 
     System.out.println("5. Credits"); 
     System.out.println("*************************************************************************"); 

Switch-Anweisung und Fall 1:

switch (input) { 
      case "1": 
       System.out.println(""); 
       System.out.println("========================================================================="); 
       System.out.println("Information for new Desktop"); 
       System.out.println("========================================================================="); 

       Desktop xx = new Desktop(); 
       boolean loop = true; 


       while (loop) { 
        System.out.print("What is the Computer ID: "); 
        xx.setComputerID(scan.nextLine().toUpperCase()); 

        if ((xx.getComputerID().startsWith("D")) && (xx.getComputerID().length() == 4)) { 
         loop = false; 
        } else { 
         System.out.println("Computer ID should start with a letter \"D\". and have 4 characters."); 
         System.out.println(""); 
        } 
       } 

       loop = true; 
       while (loop) { 
        System.out.print("What is the Processor Speed: "); 
        xx.setCPUspeed(scan.nextLine().toUpperCase()); 
        try { 
         if (StringisDouble(xx.getCPUspeed().substring(0, (xx.getCPUspeed().length() - 2))) || 
           StringisDouble(xx.getCPUspeed().substring(0, (xx.getCPUspeed().length() - 3)))) { //checks the value before GHZ or HZ if its a double 
          if (xx.getCPUspeed().endsWith("GHZ") || xx.getCPUspeed().endsWith("HZ")) { 
           loop = false; 
          } else { 
           System.out.println("CPU Speed input should end with \"GHZ\" or \"HZ\"."); 
           System.out.println(""); 
          } 
         } else { 
          System.out.println("CPU Speed input should contain a decimal or number followed by a \"GHZ\" or a \"HZ\"."); 
          System.out.println(""); 
         } 
        } catch (StringIndexOutOfBoundsException e) { 
         System.out.println("CPU Speed input should contain a decimal or number followed by a \"GHZ\" or a \"HZ\"."); 
         System.out.println(""); 
        } 

       } 

       loop = true; 
       while (loop) { 
        System.out.print("What is the RAM: "); 
        xx.setRAM(scan.nextLine().toUpperCase()); 
        try { 
         if (StringisInteger(xx.getRAM().substring(0, (xx.getRAM().length() - 2)))) {  //checks the value if it is numeric and ending with GB or MB 
          if (xx.getRAM().endsWith("GB") || xx.getRAM().endsWith("MB")) { 
           loop = false; 
          } else { 
           System.out.println("RAM input should have a numeric value and end with \"GB\" or \"MB\"."); 
           System.out.println(""); 
          } 
         } else { 
          System.out.println("RAM input should have a numeric value and end with \"GB\" or \"MB\"."); 
          System.out.println(""); 
         } 
        } catch (StringIndexOutOfBoundsException e) { 
         System.out.println("RAM input should have a numeric value and end with \"GB\" or \"MB\"."); 
         System.out.println(""); 
        } 


       } 

       loop = true; 
       while (loop) { 
        System.out.print("What is the Harddisk size: "); 
        xx.setHarddisk(scan.nextLine().toUpperCase()); 
        try { 
         if (StringisInteger(xx.getHarddisk().substring(0, (xx.getHarddisk().length() - 2)))) {  //checks the value if it is numeric and ending with GB or MB 
          if (xx.getHarddisk().endsWith("GB") || xx.getHarddisk().endsWith("TB")) { 
           loop = false; 
          } else { 
           System.out.println("Harddisk input should have a numeric value and end with \"GB\" or \"TB\"."); 
           System.out.println(""); 
          } 
         } else { 
          System.out.println("Harddisk input should have a numeric value and end with \"GB\" or \"TB\"."); 
          System.out.println(""); 
         } 
        } catch (StringIndexOutOfBoundsException e) { 
         System.out.println("Harddisk input should have a numeric value and end with \"GB\" or \"TB\"."); 
         System.out.println(""); 
        } 
       } 


       loop = true; 
       while (loop) { 
        System.out.print("What is the Monitor: "); 
        xx.setMonitor(scan.nextLine().toUpperCase()); 
        if (xx.getMonitor().equals("CRT") || xx.getMonitor().equals("LCD")) { 
         loop = false; 
        } else { 
         System.out.println("Please enter in CRT or LCD only."); 
         System.out.println(""); 
        } 
       } 

       loop = true; 
       while (loop) { 
        try { 
         System.out.print("What is the price: $"); 
         xx.setPrice(Double.parseDouble(scan.nextLine())); 
         loop = false; 
        } catch (NumberFormatException e) { 
         System.out.println("Price input should be numeric."); 
         System.out.println(""); 
        } 
       } 

       desktopList.add(xx); 

       System.out.println("Information successfully added."); 
       System.out.println(""); 
       System.out.println(""); 
       break; 

Fall 3, in dem Benutzer zu sehen bekommt, was er/sie betritt:

   case "3": 
       int DesktopCounter = 1; 
       int LaptopCounter = 1; 

       System.out.println(""); 
       if (desktopList.isEmpty()) { 
        System.out.println("No desktop added!"); 
        System.out.println(""); 
       } else { 
        for (int i = 0; i < desktopList.size(); i++) { 
         System.out.println(""); 
         System.out.println("Desktop " + DesktopCounter); 
         System.out.println("Computer ID: " + desktopList.get(i).getComputerID()); 
         System.out.println("Processor Speed: " + desktopList.get(i).getCPUspeed()); 
         System.out.println("RAM: " + desktopList.get(i).getRAM()); 
         System.out.println("Harddisk:" + desktopList.get(i).getHarddisk()); 
         System.out.println("Monitor: " + desktopList.get(i).getMonitor()); 
         System.out.println("Price: $" + f.format(desktopList.get(i).getPrice())); 
         DesktopCounter++; 
        } 
       } 
       break; 

Desktop-Klasse:

 public class Desktop extends Computer //Child class of Computer 
    { 
     private static String Monitor; 

     public Desktop() 
     { 
      ComputerID = "-- No ID specified --"; 
      CPUspeed = "-- No processor speed specified --"; 
      RAM = "-- No RAM specified-"; 
      Harddisk = "-- No Harddisk size specified --"; 
      Monitor = "-- No Monitor specified --"; 
      Price = 0.0; 
     } 



//Setters and Getters 
    public String getMonitor() 
    { 
     return Monitor; 
    } 

    public void setMonitor(String monitor) 
    { 
     Monitor = monitor; 
    } 


} 

Computer-Klasse:

public class Computer //Parent class 

{ 
protected static String ComputerID; 
protected static String CPUspeed; 
protected static String RAM; 
protected static String Harddisk; 
protected static double Price; 


public Computer() //Initializer 
{ 
    ComputerID = "-- No ID specified --"; 
    CPUspeed = "-- No processor speed specified --"; 
    RAM = "-- No amount RAM specified-"; 
    Harddisk = "-- No Harddisk size specified --"; 
    Price = 0.0; 
} 

public Computer(String computerID, String cpuspeed, String ram, String harddisk, double price) { 
    ComputerID = computerID; 
    CPUspeed = cpuspeed; 
    RAM = ram; 
    Harddisk = harddisk; 
    Price = price; 


} 


//Getters and Setters 
public String getComputerID() { 
    return ComputerID; 
} 

public void setComputerID(String computerID) { 
    ComputerID = computerID; 
} 

public String getCPUspeed() { 
    return CPUspeed; 
} 

public void setCPUspeed(String cpuspeed) { 
    CPUspeed = cpuspeed; 
} 

public String getRAM() { 
    return RAM; 
} 

public void setRAM(String ram) { 
    RAM = ram; 
} 

public String getHarddisk() { 
    return Harddisk; 
} 

public void setHarddisk(String harddisk) { 
    Harddisk = harddisk; 
} 

public double getPrice() { 
    return Price; 
} 

public void setPrice(double price) { 
    Price = price; 
} 

//End of getters and setters 

}

jetzt sagen, wenn ich einen Desktop mit Fall 1 mit den folgenden Informationen hinzufügen eingetragen in:

  • Computer-ID : D001
  • Prozessorgeschwindigkeit: 3.2GHZ
  • RAM: 512 MB
  • Festplatte: 80GB
  • Monitor: CRT

Und dann gehen Sie einen anderen Desktop mit diesen hinzuzufügen:

  • Computer-ID: D123
  • Prozessorgeschwindigkeit: 4.4GHZ
  • RAM: 8GB
  • Festplatte: 1TB
  • Monitor: LCD

Wenn ich die Informationen mit dem Fall 3 Codeblock anzuzeigen, gibt sie:

  • Desktop-1
  • Computer-ID: D123
  • Prozessorgeschwindigkeit: 4 .4GHZ
  • RAM: 8 GB
  • Festplatte: 1 TB
  • Monitor: LCD


  • Desktop 2
  • Computer-ID: D123
  • Prozessorgeschwindigkeit: 4.4GHZ
  • RAM: 8 GB
  • Festplatte: 1 TB
  • Monitor: LCD

Wenn nach rechts, Desktop-1 sollte seine eigenen einzigartigen Eigenschaften anzuzeigen.

Ich würde jede Hilfe zu schätzen wissen.

BEARBEITEN: Ich löste dieses Problem, indem ich meine Variablen nicht statisch machte.

+0

Konnte man vollständigen Code anstelle von Codeschnipsel einfügen, so wäre es leicht zu finden, wo Variablen/Referenzen initialisiert werden und Schleifen brechen. –

Antwort

0

Update nach zusätzlichem Code geschrieben wurden

Ihre Felder nicht statische in Ihrer Desktop, Computer und Laptop Klasse sein sollten. Ändern Sie diese Felder:

protected static String ComputerID; 
protected static String CPUspeed; 
protected static String RAM; 
protected static String Harddisk; 
protected static double Price; 

zu

protected String ComputerID; 
protected String CPUspeed; 
protected String RAM; 
protected String Harddisk; 
protected double Price; 

statische Felder sind die gleichen für jedes Objekt einer Klasse. Wenn Sie also mehrere Desktops haben und den Preis als statisch deklarieren, teilen alle Desktops das gleiche Preisfeld. Das ist nicht das, was Sie wollen, offensichtlich haben alle Desktops einen anderen Preis.

Auch

private static String Monitor; 

zu

private String Monitor; 

Sie haben wirklich einen separaten Monitor pro Computer wollen ändern und nicht für alle Computer den gleichen Monitor teilen.

alte Antwort

Der Code läuft perfekt hier, also muss es einige fehlende Informationen sein: das Problem in einem gewissen Teil des Codes sein muss, haben Sie nicht Beitrag:

******************* Artificial Intelligence Co. ************************* 
1. Add Information for new Desktop 
2. Add Information for new Laptop 
3. Display all computer information 
4. Quit 
5. Credits 
************************************************************************* 
3 

Desktop 1 
Computer ID: D123 
Processor Speed: 2GHZ 
RAM: 2GB 
Harddisk:1TB 
Monitor: CRT 
Price: $100.00 

Desktop 2 
Computer ID: D002 
Processor Speed: 2GHZ 
RAM: 16GB 
Harddisk:2TB 
Monitor: CRT 
Price: $500.00 

Einige Gedanken :

  • Sie die Desktop Klasse nicht veröffentlichen hat, wenn die Felder in der Klasse Desktop stati deklariert werden c, das würde die Ergebnisse erklären, stellen Sie sicher, dass sie nicht als statisch deklariert werden
  • es sieht aus wie Sie die gleiche Variable irgendwo verwenden, z.Desktop xx = new Desktop(); ist nicht in der Fall-Anweisung wie in dem Code oben ist
  • Sie möglicherweise einen falschen Index verwenden, um das Element der Liste zu erhalten, Sie sind mit einer for-i-Schleife Schleife und tun desktopList.get(i), wenn Sie desktopList.get(0) oder tun desktopList.get(someVariableThatIsAlwaysZero) drucken Sie immer das gleiche Ergebnis. Es ist sicherer, die neue Foreach-Syntax zu verwenden: for (Desktop desktop : desktopList){ ... }
  • Sie müssen lernen, den Debugger zu verwenden, Schritt für Schritt durch den Code gehen und sehen, wo die doppelten Werte eingefügt werden, und wenn keine doppelten Werte eingefügt werden, wo die drucken Anweisungen drucken und warum sie den gleichen Wert drucken; mit einem Debugger ist wirklich wichtig, Probleme zu finden
  • Ihr Code könnte nicht synchron sein

Ich werde Ihnen nur meine Version geben, die funktioniert, so dass Sie vergleichen möchten:

public static void main(String args[]) { 

     Scanner scan = new Scanner(System.in); 
     String input; 
     boolean looper = true; 
     DecimalFormat f = new DecimalFormat("#.00"); 
     ArrayList<Desktop> desktopList = new ArrayList<>(); 
     ArrayList<Laptop> laptopList = new ArrayList<>(); 

     while (looper) { 
      System.out.println(""); 
      System.out.println("******************* Artificial Intelligence Co. *************************"); 
      System.out.println("1. Add Information for new Desktop"); 
      System.out.println("2. Add Information for new Laptop"); 
      System.out.println("3. Display all computer information"); 
      System.out.println("4. Quit"); 
      System.out.println("5. Credits"); 
      System.out.println("*************************************************************************"); 

      input = scan.nextLine(); 

      switch (input) { 
       case "1": 
        System.out.println(""); 
        System.out.println("========================================================================="); 
        System.out.println("Information for new Desktop"); 
        System.out.println("========================================================================="); 

        Desktop xx = new Desktop(); 
        boolean loop = true; 


        while (loop) { 
         System.out.print("What is the Computer ID: "); 
         xx.setComputerID(scan.nextLine().toUpperCase()); 

         if ((xx.getComputerID().startsWith("D")) && (xx.getComputerID().length() == 4)) { 
          loop = false; 
         } else { 
          System.out.println("Computer ID should start with a letter \"D\". and have 4 characters."); 
          System.out.println(""); 
         } 
        } 

        loop = true; 
        while (loop) { 
         System.out.print("What is the Processor Speed: "); 
         xx.setCPUspeed(scan.nextLine().toUpperCase()); 
         try { 
          if (StringisDouble(xx.getCPUspeed().substring(0, (xx.getCPUspeed().length() - 2))) || 
            StringisDouble(xx.getCPUspeed().substring(0, (xx.getCPUspeed().length() - 3)))) { //checks the value before GHZ or HZ if its a double 
           if (xx.getCPUspeed().endsWith("GHZ") || xx.getCPUspeed().endsWith("HZ")) { 
            loop = false; 
           } else { 
            System.out.println("CPU Speed input should end with \"GHZ\" or \"HZ\"."); 
            System.out.println(""); 
           } 
          } else { 
           System.out.println("CPU Speed input should contain a decimal or number followed by a \"GHZ\" or a \"HZ\"."); 
           System.out.println(""); 
          } 
         } catch (StringIndexOutOfBoundsException e) { 
          System.out.println("CPU Speed input should contain a decimal or number followed by a \"GHZ\" or a \"HZ\"."); 
          System.out.println(""); 
         } 

        } 

        loop = true; 
        while (loop) { 
         System.out.print("What is the RAM: "); 
         xx.setRAM(scan.nextLine().toUpperCase()); 
         try { 
          if (StringisInteger(xx.getRAM().substring(0, (xx.getRAM().length() - 2)))) {  //checks the value if it is numeric and ending with GB or MB 
           if (xx.getRAM().endsWith("GB") || xx.getRAM().endsWith("MB")) { 
            loop = false; 
           } else { 
            System.out.println("RAM input should have a numeric value and end with \"GB\" or \"MB\"."); 
            System.out.println(""); 
           } 
          } else { 
           System.out.println("RAM input should have a numeric value and end with \"GB\" or \"MB\"."); 
           System.out.println(""); 
          } 
         } catch (StringIndexOutOfBoundsException e) { 
          System.out.println("RAM input should have a numeric value and end with \"GB\" or \"MB\"."); 
          System.out.println(""); 
         } 


        } 

        loop = true; 
        while (loop) { 
         System.out.print("What is the Harddisk size: "); 
         xx.setHarddisk(scan.nextLine().toUpperCase()); 
         try { 
          if (StringisInteger(xx.getHarddisk().substring(0, (xx.getHarddisk().length() - 2)))) {  //checks the value if it is numeric and ending with GB or MB 
           if (xx.getHarddisk().endsWith("GB") || xx.getHarddisk().endsWith("TB")) { 
            loop = false; 
           } else { 
            System.out.println("Harddisk input should have a numeric value and end with \"GB\" or \"TB\"."); 
            System.out.println(""); 
           } 
          } else { 
           System.out.println("Harddisk input should have a numeric value and end with \"GB\" or \"TB\"."); 
           System.out.println(""); 
          } 
         } catch (StringIndexOutOfBoundsException e) { 
          System.out.println("Harddisk input should have a numeric value and end with \"GB\" or \"TB\"."); 
          System.out.println(""); 
         } 
        } 


        loop = true; 
        while (loop) { 
         System.out.print("What is the Monitor: "); 
         xx.setMonitor(scan.nextLine().toUpperCase()); 
         if (xx.getMonitor().equals("CRT") || xx.getMonitor().equals("LCD")) { 
          loop = false; 
         } else { 
          System.out.println("Please enter in CRT or LCD only."); 
          System.out.println(""); 
         } 
        } 

        loop = true; 
        while (loop) { 
         try { 
          System.out.print("What is the price: $"); 
          xx.setPrice(Double.parseDouble(scan.nextLine())); 
          loop = false; 
         } catch (NumberFormatException e) { 
          System.out.println("Price input should be numeric."); 
          System.out.println(""); 
         } 
        } 

        desktopList.add(xx); 

        System.out.println("Information successfully added."); 
        System.out.println(""); 
        System.out.println(""); 
        break; 

       case "3": 
        int DesktopCounter = 1; 
        int LaptopCounter = 1; 

        System.out.println(""); 
        if (desktopList.isEmpty()) { 
         System.out.println("No desktop added!"); 
         System.out.println(""); 
        } else { 
         for (int i = 0; i < desktopList.size(); i++) { 
          System.out.println(""); 
          System.out.println("Desktop " + DesktopCounter); 
          System.out.println("Computer ID: " + desktopList.get(i).getComputerID()); 
          System.out.println("Processor Speed: " + desktopList.get(i).getCPUspeed()); 
          System.out.println("RAM: " + desktopList.get(i).getRAM()); 
          System.out.println("Harddisk:" + desktopList.get(i).getHarddisk()); 
          System.out.println("Monitor: " + desktopList.get(i).getMonitor()); 
          System.out.println("Price: $" + f.format(desktopList.get(i).getPrice())); 
          DesktopCounter++; 
         } 
        } 
        break; 
      } 
     } 
    } 

    private static boolean StringisInteger(String substring) {return true;} 

    private static boolean StringisDouble(String substring) { return true; } 

Meine Desktop-Klasse sieht wie folgt aus:

@Data 
public class Desktop { 

    private double price; 
    private String computerID; 
    private String CPUspeed; 
    private String RAM; 
    private String harddisk; 
    private String monitor; 

} 

Wo @Data ist eine Lombok Anmerkung, die Getter und Setter erzeugt. Wie Sie sehen können, sind die Felder nicht statisch.

+0

Hallo Danke für Ihre Hilfe, aber ich bin immer noch nicht in der Lage, die richtige Ausgabe zu erhalten, auch wenn ich die Setter nicht statisch gemacht habe. Außerdem habe ich die Desktop-Klasse und die Computer-Klasse hinzugefügt. –

+0

'privater statischer String Monitor; 'diese Felder sollten nicht statisch sein, entfernen Sie das statische Schlüsselwort:' private String Monitor' –

+0

Ich bearbeitet meine Antwort, hoffe, es funktioniert für Sie –

Verwandte Themen