【问题标题】:Java Issue with taking contents of a text file into an array and then displaying and manipulating the contents of the array将文本文件的内容放入数组然后显示和操作数组内容的 Java 问题
【发布时间】:2015-11-11 19:00:20
【问题描述】:

好的,这是一个学校项目,我似乎无法弄清楚我做错了什么,我意识到有更好的方法来做很多事情,但必须这样做(我会注意具体是什么)。

我需要编写两个非常简单的程序。

  1. 第一个程序创建一个包含 300 个 1 到 54 范围内的随机整数的文件,然后打印到一个文本文件中。

  2. 第二个程序读取该文本文件并将内容放入一个数组中。然后对数组进行操作以输出一些东西,数字的平均值,以及数字在某个范围内出现的次数。我也试图一次把整个数组拿出来。不幸的是,所有部分基本上都不起作用,或者我不理解某些东西,我很确定它都是大声笑。

方案一如下

import java.util.*;
import java.io.*;
public class OutStream{ 
public static void main(String[] args){
int Counter = 0,
    Value;
Random Gen = new Random();
System.out.println("Generating Numbers and Text File Now");
   try{
        File out = new File("F:\\Text.txt");
        PrintWriter P = new PrintWriter(out);
        while(Counter <= 300){
            Value = Gen.nextInt(54)+1;
            P.println(Value);
            ++Counter;
            System.out.println("Value: " + Value);
        } 
        P.close();
  }catch(Exception E){ 
  E.printStackTrace();
  System.out.println(E.getMessage());
  } 
  System.out.println("The Program has ended");
 }   
}

第二个程序是它全部崩溃的地方。

import java.util.*;
import java.io.*;
public class InStream {

public static void main(String[] args) {
int [] NumArray = new int[301];
int PosNum = 0,
    Total = 0,
    Average = 0,
    Range1 = 0,
    Range2 = 0,
    Range3 = 0,
    Range4 = 0,
    Range5 = 0,
    Range6 = 0;

    try{
        File Fout = new File("F:\\Text.txt");
        PosNum = 0;
        Scanner Fin = new Scanner(Fout);
        while(Fin.hasNextInt()){
            NumArray[++PosNum] = Fin.nextInt();


        }
        Fin.close();

       }catch(Exception E){
           E.printStackTrace();
           System.out.println("***ERROR ***** " + E.getMessage());
       } 


for(NumArray[PosNum] = 0; NumArray[PosNum] <= 301;){
    Total += NumArray[PosNum++];

    if(NumArray[Range1] >= 1 && NumArray[Range1] <= 10){
       Range1++;
    }

    if (NumArray[Range2] >= 11 && NumArray[Range2] <= 20){
        Range2++;
    }
    if(NumArray[Range3] >= 21 && NumArray[Range3] <= 30){
       Range3++;
    }
    if(NumArray[Range4] >= 31 && NumArray[Range4] <= 40){
       Range4++;
    }
    if(NumArray[Range5] >= 41 && NumArray[Range5] <= 50){
       Range5++;
    }
    if(NumArray[Range6] >= 51 && NumArray[Range6] <= 54){
       Range6++;
    }  

}
Average = Total / 301;
System.out.println("The Average Is: " + Average);
System.out.println("1 Through 10 appear: " + Range1 + " Times");
System.out.println(" 11 Through 20 appear: " + Range2 + "Times");
System.out.println("21 Through 30 appear: " + Range3 + " Times");
System.out.println("31 Through 40 appear: " + Range4 + " Times");
System.out.println("41 Through 50 appear: " + Range5 + " Times");
System.out.println("51 Through 54 appear: " + Range6 + " Times");
 }

} 

这是我最新的尝试。

import java.util.*;
import java.io.*;
public class FixedInstream {

public static void main(String[] args) {
    int [] MyArray = new int[301];
    int PosNum = 0,
        Average,
        Total = 0,
        R1 = 0,
        R2 = 0,
        R3 = 0,
        R4 = 0,
        R5 = 0,
        R6 = 0,
        R7 = 0;

    try{
        File Fout = new File("F:\\Text.txt");
        PosNum = 0;
        Scanner Fin = new Scanner(Fout);
        while(Fin.hasNextInt()){
            MyArray[PosNum] = Fin.nextInt();
            Total += MyArray[PosNum];
        }
        Fin.close();

    }catch(Exception E){
           E.printStackTrace();
           System.out.println("***ERROR ***** " + E.getMessage());
       } 
    for(MyArray[PosNum] = 0; MyArray[PosNum] <= 300; ++MyArray[PosNum]){


        if(MyArray[R1] >= 1 && MyArray[R1] <= 10){
            R1++;
        }

        if (MyArray[R2] >= 11 && MyArray[R2] <= 20){
            R2++;
        }
        if(MyArray[R3] >= 21 && MyArray[R3] <= 30){
            R3++;
        }
        if(MyArray[R4] >= 31 && MyArray[R4] <= 40){
            R4++;
        }
        if(MyArray[R5] >= 41 && MyArray[R5] <= 50){
            R5++;
        }
        if(MyArray[R6] >= 51 && MyArray[R6] <= 54){
            R6++;
        }  
    }

    Average = Total / 301;
    System.out.println("The Average Is: " + Average);
    System.out.println("1 Through 10 appear: " + R1 + " Times");
    System.out.println("11 Through 20 appear: " + R2 + " Times");
    System.out.println("21 Through 30 appear: " + R3 + " Times");
    System.out.println("31 Through 40 appear: " + R4 + " Times");
    System.out.println("41 Through 50 appear: " + R5 + " Times");
    System.out.println("T51 Through 54 appear: " + R6 + " Times");
  }

}

程序没有正确输出下面的示例,我显然忘记在我的初始评论中添加。

输出:

The Average Is: 27
The Numbers 1 Through 10 appear: 1 Times
The Numbers 11 Through 20 appear: 1 Times
The Numbers 21 Through 30 appear: 1 Times
The Numbers 31 Through 40 appear: 1 Times
The Numbers 41 Through 50 appear: 1 Times
The Numbers 51 Through 54 appear: 1 Times

文本文件中有 300 个数字 1 - 54 这些数字重复的方式不同,但通常是 10 - 50 次,正如您从上面看到的那样,它只显示一次,这让我相信我不会增加一些东西正确。

【问题讨论】:

  • 您需要演示确切的问题、输入和预期输出,以及您为尝试调试问题所做的工作。
  • 我同意@SkinnyJ 的观点,你对到底发生了什么还不够清楚。另外,当您说必须以这种方式完成时,您的意思是什么?与 Scanner 类相比,有更好的方法来读取和写入这些文件,包括 BufferedReaders 和 Writers。你能澄清一下吗?
  • 我已经在程序的最顶部和源代码的底部进行了上述操作。 1.我需要找到该区域包含的平均数。 2. 我需要显示数字 1- 10 11- 20 21 - 30 31 - 40 等重复的次数。我尝试了很多不同的东西,我不会去购物中心,因为它不相关。我稍后会发布最新的尝试
  • " 必须以这种方式完成" 这很不言自明,这是一个学校项目,这意味着我的布局方式就是它必须提交的方式。显然错误必须被修复,我正在尝试这样做。我不是在找你重写我的源代码我在寻找正确的方向。

标签: java arrays inputstream


【解决方案1】:

我认为这里有很多令人困惑的事情...下面是答案,但我建议您尝试自己调试此 sn-p 以了解问题所在。

  1. 您正在遍历具有301 单元格的数组。数组索引从0length-1。当 posNum 初始化为 0 时,您使用 numArray[++posNum] 进行迭代,第一个索引将是 ++0 = 1。所以你永远不会到达数组的第一个单元格。这会导致out of range exception,因为最后一个索引是301,但实际上最后一个索引是300...只需阅读异常消息即可找到解决方案。

  2. 我建议您看一下for loop 的工作原理,以了解如何使用递增索引逐个单元格地浏览数组。然后你会像这样更正你的 for 循环:

    for(int idx = 0; idx

  3. 您使用错误的变量访问当前单元格。这可以附加,但您会在调试模式下非常快地检测到它...

    NumArray[idx]

而不是

NumArray[Range1]
  1. 这对于使您的程序正常运行并不是必不可少的,但是在 Java 中存在一些约定(如在每种语言中一样),并且variables 是用camelCase 编写的。

    公共类 InStream {

    public static void main(String[] args) {
        int [] NumArray = new int[301];
        int PosNum = 0,
            Total = 0,
            Average = 0,
            Range1 = 0,
            Range2 = 0,
            Range3 = 0,
            Range4 = 0,
            Range5 = 0,
            Range6 = 0;
    
        try{
            File Fout = new File("F:\\Text.txt");
            PosNum = 0;
            Scanner Fin = new Scanner(Fout);
            while(Fin.hasNextInt()){
                NumArray[PosNum++] = Fin.nextInt();
            }
            Fin.close();
    
        }catch(Exception E){
            E.printStackTrace();
            System.out.println("***ERROR ***** " + E.getMessage());
        }
    
    
        for(int idx = 0; idx < NumArray.length; idx++){
            Total += NumArray[idx];
    
            if(NumArray[idx] >= 1 && NumArray[idx] <= 10){
                Range1++;
            }
    
            if (NumArray[idx] >= 11 && NumArray[idx] <= 20){
                Range2++;
            }
            if(NumArray[idx] >= 21 && NumArray[idx] <= 30){
                Range3++;
            }
            if(NumArray[idx] >= 31 && NumArray[idx] <= 40){
                Range4++;
            }
            if(NumArray[idx] >= 41 && NumArray[idx] <= 50){
                Range5++;
            }
            if(NumArray[idx] >= 51 && NumArray[idx] <= 54){
                Range6++;
            }
        }
        Average = Total / 301;
        System.out.println("The Average Is: " + Average);
        System.out.println(" 1 Through 10 appear: " + Range1 + " Times");
        System.out.println("11 Through 20 appear: " + Range2 + " Times");
        System.out.println("21 Through 30 appear: " + Range3 + " Times");
        System.out.println("31 Through 40 appear: " + Range4 + " Times");
        System.out.println("41 Through 50 appear: " + Range5 + " Times");
        System.out.println("51 Through 54 appear: " + Range6 + " Times");
    }
    

    }

不要犹豫,调试你的程序,这是学习语言和享受 Java 的最佳方式

【讨论】:

  • 谢谢 Miam84 我非常沮丧,因为我的第一个版本看起来像这样,但有一些例外,例如我是新的 .length() 但我的印象是它只适用于字符串我错了!另外我想指出,理解数组越界异常是很清楚的,我确实理解如何解决它我还说我正在重新编写它。我主要是在修复前后增加 java 的问题上也需要比我习惯的更多的东西,而且我正处于学习它的开始阶段,才几天
  • 为它的帮助感到自豪。那么现在您可以更进一步了;)由于此答案解决了您的问题,因此您可以使用复选标记将其设置为已接受。这会将问题标记为已解决
猜你喜欢
  • 2019-09-24
  • 2014-04-07
  • 2016-09-10
  • 2018-02-11
  • 1970-01-01
  • 2014-02-17
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多