gpt4 book ai didi

java - 使用扫描仪和异常读取文本文件中的整数并存储到数组

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:56 24 4
gpt4 key购买 nike

我正在尝试循环遍历文本文件中的整数并将找到的整数存储到数组中。

使用 try-catch 来确定哪些单词是整数,哪些不是使用 InputMismatchException,从输入流中删除非 int 字符串。以及文件中空行的 NoSuchElementException。我的主要问题是在我的第二种方法中存储整数并在数组中打印这些整数:o。看来我的循环也将非整数记录为空。它们不应该存储到数组中。

public static void main(String[] commandlineArgument) {
Integer[] array = ReadFile6.readFileReturnIntegers(commandlineArgument[0]);
ReadFile6.printArrayAndIntegerCount(array, commandlineArgument[0]);
}

public static Integer[] readFileReturnIntegers(String filename) {
Integer[] array = new Integer[1000];
// connect to the file
File file = new File(filename);
Scanner inputFile = null;
try {
inputFile = new Scanner(file);
}
// If file not found-error message
catch (FileNotFoundException Exception) {
System.out.println("File not found!");
}
// if connected, read file
if (inputFile != null) {
// loop through file for integers and store in array
while (inputFile.hasNextLine()) {
for(int i = 0; i<array.length; i++)
{
try{
array[i] = inputFile.nextInt();
}
catch(InputMismatchException excep1)
{
String word = inputFile.next();
}
catch(NoSuchElementException excep2){
}
}
}
}
return array;
}

public static void printArrayAndIntegerCount(Integer[] array, String filename) {
//prints number of integers from file
//prints each integer in array
}
}

最佳答案

第一种方法中采用的方法有点缺陷,因为无论是否读取整数,您都会递增 i 变量。

例如,如果文件如下所示:

4
Hello
5
e
7

数组的开头看起来像

[4, null, 5, null, 7...]

所以你最终会得到一个大小为 1000 的数组,其中在不可预测的地方有空值。

稍微好一点的方法是这样的:

  • 保留一个单独的count变量,用于表示您实际读取了多少个整数。
  • 将项目添加到索引 count 处的数组中,而不是在 i 处(因为 i 只是表示您查看了多少行,而 count 会告诉您遇到了多少个整数)。
  • 当您读完它们后,
    • count 变量传递给打印数组的方法(因此它只知道查看前 count 项),或者
    • 只需将整个数组复制到大小为 count 的新数组中即可。

将其合并到代码中的示例:

if(inputFile != null) {
// the number of integers we've read so far
int count = 0;

// loop through file for integers and store in array
while(inputFile.hasNextLine()) {
for(int i = 0; i < array.length; i++) {
try {
array[count] = inputFile.nextInt();
count++;
} catch(InputMismatchException excep1) {
String word = inputFile.next();
} catch(NoSuchElementException excep2) {
}
}
}
}
<小时/>

然后复制到正确大小的数组中,

Integer[] newArray = new Integer[count];
for(int i = 0; i < count; i++) {
newArray[i] = array[i];
}

并且只返回newArray而不是array

您的打印方法将具有与您期望的相同的签名和功能:

public static void printArrayAndIntegerCount(Integer[] array, String filename) {
for(int i = 0; i < array.length; i++) {
// print the number at array[i], and whatever else you want to print
}
}

这可能是更好的方法,因为您仍然可以保持所有方法签名相同,并且不需要浪费时间返回多个变量或更改全局状态。

<小时/>

或者,如果您不想将相关位复制到新数组中,那么您可以将 count 变量以某种方式传递给第二个方法,然后执行类似的操作

for(int i = 0; i < count; i++) {
System.out.println("\tindex = " + i + ", element = " + array[i]);
}

主要区别在于您要迭代到 count,而不是达到 array.length

您需要找到一种方法从第一个方法中返回该值以及数组(或者可能在某处设置静态变量),然后您需要将第二个方法的签名更改为

public static void printArrayAndIntegerCount(Integer[] array, int count, String filename) {
...
}

关于java - 使用扫描仪和异常读取文本文件中的整数并存储到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com