产品循环用户询问产品最贵的数量

时间:2014-09-23 00:53:27

标签: java

我正忙着这个节目。有人请告诉我我做错了什么吗?程序提示用户输入产品目录中的产品数量。然后,程序应提示用户输入产品目录中每个产品的名称和价格。输入所有产品后,程序应输出目录中最昂贵产品的产品信息(名称和价格)。您的解决方案,以最高的价格跟踪产品。

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);
    }
}

当我运行这个程序时,它会问我多少次,当我把它放在两个问题中时我都无法输入任何东西,实际上,产品问题假设首先出现然后是价格问题

2 个答案:

答案 0 :(得分:3)

首先,您输错了:

这一行:

String name1 = in.toString();

应该是:

String name1 = in.next();

通过调用in.toString(),您正在调用将返回此Scanner的字符串表示形式的方法。此方法将从Object类中覆盖,该类是Java中所有类的父类,通常用于调试目的。

当您致电in.next()时,您将阅读String输入流中的下一个Scanner令牌。

其次,您没有在循环中使用name1变量或int price变量。

对于这部分:

  

然后,程序应提示用户提供产品目录中每种产品的名称和价格。

现在,您所做的只是在循环中创建变量name1price,而不是将它们用于任何事情。在上一个打印声明中,打印的nameprice是您在程序开头指定的值。

// 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 expProdNameint expProdPrice来跟踪最昂贵的产品信息。您还需要两个临时变量String currProdNameint 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。

read more about next()