读取整数文本文件并使用扫描程序和异常存储到数组

时间:2014-01-24 02:00:45

标签: java arrays exception file-io java.util.scanner

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

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

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

3 个答案:

答案 0 :(得分:0)

假设您从文件中读取整数的所有逻辑都是正确的,并且希望这是一种家庭工作。虽然以下实施方法不是正确的方法,但它只是解决了您的目的。我们在这里所做的就是迭代数组中的所有元素,直到它到达null并继续将它们写入缓冲区。

public static void printArrayAndIntegerCount(Integer[] array, String filename) {
   StringBuilder sb = new StringBuilder();
   int count = 0;
   for(Integer i : array) {
      if(i != null) {
          count++;
          sb.append("index = ").append(i).append(", element = ").append(array[i]).append("\n");
      } else {
          break;
      }
   }
   System.out.println("number of integers in file \""+filename+"\" = "+count);
   System.out.println(sb);
}

答案 1 :(得分:0)

将您的catch语句替换为:

catch(InputMismatchException excep1)
{
      String word = inputFile.next();
      i-=1;
}

如果找到一个单词,你正在递增数组计数器。我已经进行了自己的测试,这对我来说可以解决你的问题。

 public static void printArrayAndIntegerCount(Integer[] array, String filename) {
       String message = "";
       int i = 0;
       while(i < array.length && array[i]!=null){
           message = message + "index = "+i+", element = "+array[i]+"\n";
           i+=1;
        }
       System.out.println("number of integers in file \""+filename+"\" = "+i);
       System.out.println(message);
}

答案 2 :(得分:0)

第一种方法采用的方法有点缺陷,因为无论是否读取整数,都会递增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) {
    ...
}