我正在尝试遍历整数的文本文件,并将存储的整数存储到数组中。
使用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
}
}
答案 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) {
...
}