【问题标题】:Java Array Not Printing (BlueJ being used)Java 数组未打印(正在使用 BlueJ)
【发布时间】:2018-04-10 02:48:51
【问题描述】:

我目前正在尝试完成一项需要使用 Java 编程的大学任务。任务如下。

我必须对“钓鱼比赛”的输入文件进行排序。该文件首先为每一行给出一个整数(1-7 之间),然后是一个实数。棘手的部分是这些数字尚未加起来或按顺序加起来。这意味着我必须让程序读取整数,证明它需要的位置,然后将以下权重添加到该位置。

以下是文件外观的概念

3 36.2

6 27.8

7 10.3

我对如何完成整个任务有一个大致的想法,但我被困在一个部分,即打印每个参赛者的总重量。

这是我到目前为止编写的代码。如果您能告诉我可能给我带来的问题,将不胜感激。 (它没有给出错误代码,而是我正在使用的软件BlueJ,只是不断尝试运行程序)

import java.io.*;
import java.util.Scanner;
public class Project7
{
    public static void main(String[] args)
    throws FileNotFoundException
    {
        Scanner inF = new Scanner(new File("inputpro7.txt"));
        int [] arrayNum = new int[7];
        double [] arrayWeight = new double[7];
        int place = inF.nextInt();
        double weight = inF.nextDouble();
            for (int m = 0; m < 7; m++)
                {
                    arrayNum[m] = m + 1;
                }
            while (inF.hasNextLine())
                {
                    if (place == 1)
                        arrayWeight[0] += weight;
                    else if (place == 2)
                        arrayWeight[1] += weight;
                    else if (place == 3)
                        arrayWeight[2] += weight;
                    else if (place == 4)
                        arrayWeight[3] += weight;
                    else if (place == 5)
                        arrayWeight[4] += weight;
                    else if (place == 6)
                        arrayWeight[5] += weight;
                    else 
                        arrayWeight[6] += weight;    
                } 
            for (int k = 0; k < 7; k++) 
                System.out.printf("%6d %6.2f%n", arrayNum[k],                  
                arrayWeight[k]);
        inF.close();
    }
}

【问题讨论】:

  • 为什么while循环应该结束?您没有从 Scanner within 循环中获得任何行。所以循环条件永远不会变成假。您需要在 while 循环 within 中从 Scanner 读取,以便条件(下一行退出)变为 false,因为您已经遍历了文件。
  • 您遇到此问题表明您还不知道如何“在脑海中或在纸上遍历代码”,如果您需要经常学习和练习此技能'要进步。
  • @HovercraftFullOfEels 感谢您的意见。考虑到这一点,我将编写代码。我这学期刚开始学习java,所以我不自称是任何专家。我猜我们都必须从某个地方开始?

标签: java arrays boolean


【解决方案1】:

代码中的问题出在 While 循环中。您不断地阅读输入文件的第一行。 While 循环内没有 read nextline 语句。即使您放置了该语句(阅读下一行),您也需要对代码进行一些修改。以下是修改后的代码。

public class ExampleCode {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner inF = new Scanner(new File("Input.txt"));
        int[] arrayNum = new int[7];
        double[] arrayWeight = new double[7];
        int place;
        double weight;

        for (int m = 0; m < 7; m++) {
            arrayNum[m] = m + 1;
        }

        while (inF.hasNextLine()) {
            place = inF.nextInt();
            weight = inF.nextDouble();
            if (place == 1)
                arrayWeight[0] += weight;
            else if (place == 2)
                arrayWeight[1] += weight;
            else if (place == 3)
                arrayWeight[2] += weight;
            else if (place == 4)
                arrayWeight[3] += weight;
            else if (place == 5)
                arrayWeight[4] += weight;
            else if (place == 6)
                arrayWeight[5] += weight;
            else
                arrayWeight[6] += weight;
        }
        for (int k = 0; k < 7; k++)
            System.out.printf("%6d %6.2f%n", arrayNum[k], arrayWeight[k]);
        inF.close();
    }
}

解决此类问题“处理输入文件并根据相似的键值聚合输入”的最佳方法是使用 HashMap。以下是可能的解决方案。

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Scanner;

    public class ExampleCode {

        public static void main(String[] args) throws FileNotFoundException
        {
            Scanner inF = new Scanner(new File("Input.txt"));
            Map<String, Double> table = new HashMap<String, Double>(); 
            String line = "";
            String token[] = new String[2];

            //Process till end of file
            while (inF.hasNextLine())
            {
                //Read each lines
                line = inF.nextLine();
                //Split line based on separator i.e " " character
                //use these tokens as Key-Value pairs
                token = line.split(" ");

                //If table already has the entry add the value to same key entry
                if(table.containsKey(token[0])){
                    Double value = table.get(token[0]) + new Double(token[1]);
                    table.put(token[0], value);
                } else { //If key not found, insert the new entry
                    table.put(token[0], new Double(token[1]));
                }
            }

            for(Entry entry : table.entrySet()){
                System.out.println("Key:"+entry.getKey()+" == Value:"+entry.getValue());
            }
            //close the file 
            inF.close();
        }
    }

Sample Input file: 
2 9.25
4 8.5
1 1.5
2 4.215
5 1.4555
6 8.989
7 1
4 8.049
1 3.567

Output : 
Key:1 == Value:5.067
Key:2 == Value:13.465
Key:4 == Value:16.549
Key:5 == Value:1.4555
Key:6 == Value:8.989
Key:7 == Value:1.0

【讨论】:

  • 感谢您的提示!我会完全使用 HashMap,但是,我的教授。相当挑剔,不允许我们导入除 java.io、java.util.Scanner 之外的各种包......遇到这个错误。 java.util.NoSuchElementException 在“place = inF.nextInt();”行上。关于我可能忽略的任何建议?
  • 我已经更正了您的代码并发布了工作版本。 Hashmap 方法是另一种解决方案。请参阅我已更正您的代码的答案的开头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多