以前的输入被较新的输入覆盖
Previous Input gets overwritten by Newer Input
您好,我的程序真的需要帮助,我到处搜索解决方案,但似乎找不到我要找的东西。
我正在制作一个程序,用户可以在其中添加桌面,为其输入各种信息,然后将其添加到数组列表中。
代码如下:
简介:
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 语句和案例 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;
案例 3,用户可以看到 he/she 输入的内容:
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;
桌面 Class:
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;
}
}
计算机Class:
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
}
现在假设我使用案例 1 添加桌面并输入以下信息:
- 计算机 ID:D001
- 处理器速度:3.2GHZ
- 内存:512MB
- 硬盘:80GB
- 显示器:CRT
然后继续使用这些添加另一个桌面:
- 计算机 ID:D123
- 处理器速度:4.4GHZ
- 内存:8GB
- 硬盘:1TB
- 显示器:LCD
当我使用案例3代码块显示信息时,它输出:
- 桌面 1
- 计算机 ID:D123
- 处理器速度:4.4GHZ
- 内存:8GB
- 硬盘:1TB
- 显示器:LCD
- 桌面 2
- 计算机 ID:D123
- 处理器速度:4.4GHZ
- 内存:8GB
- 硬盘:1TB
- 显示器:LCD
如果正确,桌面 1 应该显示其自己的独特属性。
如有任何帮助,我将不胜感激。
编辑:我通过使我的变量成为非静态变量解决了这个问题。
在 posted
额外代码后更新
您的字段在 Desktop
、Computer
和 Laptop
class 中不应 static。更改这些字段:
protected static String ComputerID;
protected static String CPUspeed;
protected static String RAM;
protected static String Harddisk;
protected static double Price;
至
protected String ComputerID;
protected String CPUspeed;
protected String RAM;
protected String Harddisk;
protected double Price;
class 的每个对象的静态字段都相同。因此,如果您有多个桌面并且您将价格声明为静态,则所有桌面将共享相同的价格字段。这不是你想要的,显然所有台式机都有另一个价格。
也改
private static String Monitor;
至
private String Monitor;
您真的希望每台计算机都有一个单独的显示器,而不是为所有计算机共享同一个显示器。
旧答案
代码在这里运行完美,所以一定有一些缺失的信息:问题一定是在你没有的代码的某些部分post:
******************* 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: 0.00
Desktop 2
Computer ID: D002
Processor Speed: 2GHZ
RAM: 16GB
Harddisk:2TB
Monitor: CRT
Price: 0.00
一些想法:
- 你没有post
Desktop
class,如果Desktop
class中的字段声明为静态的,那将解释结果,确保它们没有被声明为 static
- 您似乎在某处使用了相同的变量,例如
Desktop xx = new Desktop();
不像上面的代码那样在 case 语句中
- 您可能使用了错误的索引来获取列表项,您正在使用 for-i 循环循环并执行
desktopList.get(i)
如果您碰巧执行 desktopList.get(0)
或 desktopList.get(someVariableThatIsAlwaysZero)
你将始终打印相同的结果。使用新的 foreach 语法更安全:for (Desktop desktop : desktopList){ ... }
- 你必须学会使用调试器,一步一步地检查代码,看看在哪里插入了重复值,如果没有插入重复值,看看打印语句在哪里打印以及它们打印的原因相同的值;使用调试器对于发现问题非常重要
- 您的代码可能不同步
我只会给你我的版本,所以你可能想要比较:
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; }
我的桌面 class 看起来像这样:
@Data
public class Desktop {
private double price;
private String computerID;
private String CPUspeed;
private String RAM;
private String harddisk;
private String monitor;
}
其中 @Data
是生成 setter 和 getter 的 Lombok 注释。如您所见,字段不是静态的。
您好,我的程序真的需要帮助,我到处搜索解决方案,但似乎找不到我要找的东西。
我正在制作一个程序,用户可以在其中添加桌面,为其输入各种信息,然后将其添加到数组列表中。
代码如下:
简介:
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 语句和案例 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;
案例 3,用户可以看到 he/she 输入的内容:
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;
桌面 Class:
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;
}
}
计算机Class:
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
}
现在假设我使用案例 1 添加桌面并输入以下信息:
- 计算机 ID:D001
- 处理器速度:3.2GHZ
- 内存:512MB
- 硬盘:80GB
- 显示器:CRT
然后继续使用这些添加另一个桌面:
- 计算机 ID:D123
- 处理器速度:4.4GHZ
- 内存:8GB
- 硬盘:1TB
- 显示器:LCD
当我使用案例3代码块显示信息时,它输出:
- 桌面 1
- 计算机 ID:D123
- 处理器速度:4.4GHZ
- 内存:8GB
- 硬盘:1TB
- 显示器:LCD
- 桌面 2
- 计算机 ID:D123
- 处理器速度:4.4GHZ
- 内存:8GB
- 硬盘:1TB
- 显示器:LCD
如果正确,桌面 1 应该显示其自己的独特属性。
如有任何帮助,我将不胜感激。
编辑:我通过使我的变量成为非静态变量解决了这个问题。
在 posted
额外代码后更新您的字段在 Desktop
、Computer
和 Laptop
class 中不应 static。更改这些字段:
protected static String ComputerID;
protected static String CPUspeed;
protected static String RAM;
protected static String Harddisk;
protected static double Price;
至
protected String ComputerID;
protected String CPUspeed;
protected String RAM;
protected String Harddisk;
protected double Price;
class 的每个对象的静态字段都相同。因此,如果您有多个桌面并且您将价格声明为静态,则所有桌面将共享相同的价格字段。这不是你想要的,显然所有台式机都有另一个价格。
也改
private static String Monitor;
至
private String Monitor;
您真的希望每台计算机都有一个单独的显示器,而不是为所有计算机共享同一个显示器。
旧答案
代码在这里运行完美,所以一定有一些缺失的信息:问题一定是在你没有的代码的某些部分post:
******************* 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: 0.00
Desktop 2
Computer ID: D002
Processor Speed: 2GHZ
RAM: 16GB
Harddisk:2TB
Monitor: CRT
Price: 0.00
一些想法:
- 你没有post
Desktop
class,如果Desktop
class中的字段声明为静态的,那将解释结果,确保它们没有被声明为 static - 您似乎在某处使用了相同的变量,例如
Desktop xx = new Desktop();
不像上面的代码那样在 case 语句中 - 您可能使用了错误的索引来获取列表项,您正在使用 for-i 循环循环并执行
desktopList.get(i)
如果您碰巧执行desktopList.get(0)
或desktopList.get(someVariableThatIsAlwaysZero)
你将始终打印相同的结果。使用新的 foreach 语法更安全:for (Desktop desktop : desktopList){ ... }
- 你必须学会使用调试器,一步一步地检查代码,看看在哪里插入了重复值,如果没有插入重复值,看看打印语句在哪里打印以及它们打印的原因相同的值;使用调试器对于发现问题非常重要
- 您的代码可能不同步
我只会给你我的版本,所以你可能想要比较:
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; }
我的桌面 class 看起来像这样:
@Data
public class Desktop {
private double price;
private String computerID;
private String CPUspeed;
private String RAM;
private String harddisk;
private String monitor;
}
其中 @Data
是生成 setter 和 getter 的 Lombok 注释。如您所见,字段不是静态的。