我正忙着这个节目。有人请告诉我我做错了什么吗?程序提示用户输入产品目录中的产品数量。然后,程序应提示用户输入产品目录中每个产品的名称和价格。输入所有产品后,程序应输出目录中最昂贵产品的产品信息(名称和价格)。您的解决方案,以最高的价格跟踪产品。
import java.util.Scanner;
public class ProductTester
{
private static final String price = null;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter the number of Products: ");
int count = in.nextInt();
int name = 1;
int item = 1;
for (int i = 1; i <= count; i++) {
System.out.print("Enter the Name of Product " + item + " :\n");
String name1 = in.toString();
System.out.print("Enter the Price of Product " + item + " :");
int price = in.nextInt();
item++;
}
System.out.println("Product = " + name + "$ " + price);
}
}
当我运行这个程序时,它会问我多少次,当我把它放在两个问题中时我都无法输入任何东西,实际上,产品问题假设首先出现然后是价格问题
答案 0 :(得分:3)
首先,您输错了:
这一行:
String name1 = in.toString();
应该是:
String name1 = in.next();
通过调用in.toString()
,您正在调用将返回此Scanner
的字符串表示形式的方法。此方法将从Object
类中覆盖,该类是Java中所有类的父类,通常用于调试目的。
当您致电in.next()
时,您将阅读String
输入流中的下一个Scanner
令牌。
其次,您没有在循环中使用name1
变量或int price
变量。
对于这部分:
然后,程序应提示用户提供产品目录中每种产品的名称和价格。
现在,您所做的只是在循环中创建变量name1
和price
,而不是将它们用于任何事情。在上一个打印声明中,打印的name
和price
是您在程序开头指定的值。
// the values shown bellow are printed
// ...
private static final String price = null;
// ...
int name = 1;
// ...
所以你的程序将始终打印:
Product = 1$ null
您应该删除final static String price
变量,因为它没有任何实际意义。
对于存储产品,您可能希望使用Java Collection中的对象,例如ArrayList
。为此,您应该创建一个名为Product
的类,其中包含产品名称和价格,然后构建它们的列表。
class Product {
String name;
int price;
}
这将是一个更好,更清洁,面向对象的方法来解决您的问题。但是,您也可以在两个变量中跟踪最大的价格和产品名称(因为您的计划似乎如此),所以我将告诉您如何做到这一点。
输入所有产品后,程序应输出目录中最昂贵产品的产品信息(名称和价格)。
因此,您可以使用两个变量String expProdName
和int expProdPrice
来跟踪最昂贵的产品信息。您还需要两个临时变量String currProdName
和int currProdPrice
来获取用户当前输入的信息。
在循环中,您使用变量item
来打印产品的顺序,但您可以使用循环计数器i
来执行此操作。
您应该将expProdPrice
(这是迄今为止最昂贵的价格)初始化为Integer.MIN_VALUE
,这是可能的最低整数值,因此与新价格进行比较肯定会找到最高价格。但是,考虑到产品价格不应该是负数,您也可以将其初始化为-1。
然后在循环中,每次读取新价格时,都会将其与expProdPrice
中存储的值进行比较,如果值更大,则将最昂贵的价格更新为此新价格。
您还需要更新产品名称。
让我们看看代码的外观:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter the number of Products: ");
int count = in.nextInt();
String expProdName = ""; // expensive product name
int expProdPrice = Integer.MIN_VALUE; // expensive product price
String currProdName = ""; // current product name
int currProdPrice = -1; // current product price
for (int i = 1; i <= count; i++) {
System.out.print("Enter the Name of Product " + i + " :\n");
currProdName = in.next();
System.out.print("Enter the Price of Product " + i + " :\n");
currProdPrice = in.nextInt();
// if current price larger that the most expensive price thus far
// update the most expensive price to the current price and
// update the name of the most expensive product to current product's name
if(currProdPrice > expProdPrice) {
expProdPrice = currProdPrice;
expProdName = currProdName;
}
}
System.out.println("\nMost expensive product is:\n\nProduct name:\t" + expProdName +
"\nProduct price:\t" + expProdPrice + "$");
}
答案 1 :(得分:0)
这里
String name1 = in.toString();<-- you do not read anything from the console
you just convert Scanner to String which
does not make sense at all
更改为
String name1 = in.next(); <-- reads one token which is type
String from System.in for you
java.util.Scanner.next()方法查找并返回下一个 来自此扫描仪的完整令牌。一个完整的令牌前面和 后跟与分隔符模式匹配的输入。这种方法可以 在等待输入扫描时阻塞,即使是先前的调用 hasNext()返回true。