为什么代码会打印两次语句,但方式不同?

Why does the code print the statement twice, but differently?

提问人:Christopher Prinze 提问时间:11/13/2021 最后编辑:Nowhere ManChristopher Prinze 更新时间:11/14/2021 访问量:87

问:

我的问题陈述是:

编写一个程序,用于创建泛型类的两个实例 LinkedList。
第一个实例是 stadiumNames,将保存 键入 String。
第二个实例是 gameRevenue,将持有 键入 Double。
在一个循环中,读取期间进行的球类比赛的数据 一个季节。
比赛的数据由体育场名称和 为那场比赛赚了多少钱。
将游戏数据添加到 stadiumNames 和 gameRevenue。
由于可以在特定体育场进行多场比赛,因此 stadiumNames 可能具有重复的条目。
读取所有比赛的数据后,阅读体育场名称并显示该体育场所有比赛的总金额。

我正在尝试从用户那里获取每个输入,然后将每个输入相加并得到其总和,起初似乎是正确的,但随后它打印了另一个完全不同的数量。为什么?任何帮助都表示赞赏。

每个输入 和 都添加到一个 .stadiumNamegameRevenuelinkedList

请注意,我已经编写了两个链表,但它不允许我发布大量代码。谢谢。

boolean Data = true;
while (Data) {
    stadiumNames.add(name);
    gameRevenue.add(rev);
    System.out.println("Do you want another game? ");
    String yesorno = scan.next();
    if (yesorno.equals("No"))
        break;
    else {
        if (yesorno.equals("yes"))
            System.out.println("Enter stadium name: ");
        name = scan.next();
        System.out.println("Enter amount of money for the game: ");
        rev = scan.nextDouble();
        for (int i = 0; i < stadiumNames.size(); i++) {
            if (stadiumNames.get(i).equals(name)) {
                rev += gameRevenue.get(i);
                System.out.println("The total amount of money for " + name + " is " + rev);
            }
        }
    }
}

Attached image of the output

Java 循环 ArrayList 链接列表 java.util.scanner

评论

2赞 001 11/13/2021
我们来SO。请清理代码。缩进不好。良好的格式使代码更易于阅读,并有助于发现错误。还有:提问时请不要上传代码/错误的图像。
0赞 001 11/13/2021
这可能与以下问题有关:扫描程序在使用 next() 或 nextFoo() 后跳过 nextLine()?
0赞 samabcde 11/13/2021
欢迎来到 stackoverflow。我刚刚格式化了你的问题,也请 1.将图像替换为文本 2。提供示例输入、程序的输出和预期的正确输出。
0赞 rushi 11/13/2021
@Christopher Prinze,请输入预期输出和实际输出。
0赞 Optional 11/14/2021
我刚刚添加了一些变量初始值设定器,没有看到您报告的问题。您可以在此处运行自己的代码 onecompiler.com/java/3xhbauf39

答:

0赞 Nowhere Man 11/14/2021 #1

如果要在用户输入数据时打印运行总计,则应为每次计算重置。total


while (true) {
    System.out.println("Do you want another game? ");
    String yesorno = scan.next();
    if (yesorno.equals("No"))
        break; // else not needed

    System.out.println("Enter stadium name: ");
    name = scan.next();
    System.out.println("Enter amount of money for the game: ");
    rev = scan.nextDouble();

    stadiumNames.add(name);
    gameRevenue.add(rev);

    double total = 0.0;

    // recalculating the total for the last stadium
    for (int i = 0; i < stadiumNames.size(); i++) {
        if (stadiumNames.get(i).equals(name)) {
            total += gameRevenue.get(i);
        }
    }
    System.out.println("The total amount of money for " + name + " is " + total);
}

但是,可能需要计算多个不同体育场的总数,并且需要在循环后为此创建和填充地图。
使用Map::merge功能来累积每个体育场名称的总数很方便。
while

Map<String, Double> totals = new LinkedHashMap<>();
for (int i = 0; i < stadiumNames.size(); i++) {
    totals.merge(stadiumNames.get(i), gameRevenue.get(i), Double::sum);
}
totals.forEach((stad, sum) -> System.out.println("The total amount of money for " + stad + " is " + sum));

旁注:不建议将其用于财务计算,因为浮点数学不精确double