我在文件'array.txt'中有一个2-D int数组。我试图在二维数组中读取文件中的所有元素。我在复制方面遇到问题。它显示复制后所有元素值为'0'而不是原始值。请帮我。 我的代码是:
import java.util.*;
import java.lang.*;
import java.io.*;
public class appMainNineSix {
/**
* @param args
*/
public static void main(String[] args)
throws java.io.FileNotFoundException{
// TODO Auto-generated method stub
Scanner input = new Scanner (new File("src/array.txt"));
int m = 3;
int n = 5;
int[][] a = new int [m][n];
while (input.next()!=null){
for (int i=0;i<m;i++){
for (int j=0;j<n;j++)
a[i][j]= input.nextInt();
}
}
//print the input matrix
System.out.println("The input sorted matrix is : ");
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
System.out.println(a[i][j]);
}
}
}
答案 0 :(得分:9)
while (input.next()!=null)
这会消耗扫描仪输入流中的内容。相反,请尝试使用while (input.hasNextInt())
根据您希望代码的强大程度,您还应该在for循环中检查是否可以读取某些内容。
Scanner input = new Scanner (new File("src/array.txt"));
// pre-read in the number of rows/columns
int rows = 0;
int columns = 0;
while(input.hasNextLine())
{
++rows;
Scanner colReader = new Scanner(input.nextLine());
while(colReader.hasNextInt())
{
++columns;
}
}
int[][] a = new int[rows][columns];
input.close();
// read in the data
input = new Scanner(new File("src/array.txt"));
for(int i = 0; i < rows; ++i)
{
for(int j = 0; j < columns; ++j)
{
if(input.hasNextInt())
{
a[i][j] = input.nextInt();
}
}
}
使用ArrayLists的替代方法(无需预读):
// read in the data
ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
Scanner input = new Scanner(new File("src/array.txt"));
while(input.hasNextLine())
{
Scanner colReader = new Scanner(input.nextLine());
ArrayList col = new ArrayList();
while(colReader.hasNextInt())
{
col.add(colReader.nextInt());
}
a.add(col);
}
答案 1 :(得分:0)
问题可能是你有一对嵌套循环来读取里面的那些循环中的数字。为什么在读完一次后,你想要重新读取数组值?请注意,如果在最后一个数字之后文件中有任何,那么在到达文件末尾之后,您将使用任何.nextInt()
返回填充数组!
编辑 - 好吧.nextInt()
应该抛出一个异常我想输入用完了,所以这可能不是问题。
答案 2 :(得分:0)
开始简单......
变化:
for (int j=0;j<n;j++)
a[i][j]= input.nextInt();
为:
for (int j=0;j<n;j++)
{
int value;
value = input.nextInt();
a[i][j] = value;
System.out.println("value[" + i + "][" + j + " = " + value);
}
确保读入值。
此外,如果没有先调用(并检查)hasNext(或nextInt / hasNextInt),则不应调用next。
答案 3 :(得分:0)
问题是,当你到达文件的末尾时,它会通过一个没有usch元素的异常。
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Scanner input = new Scanner(new File("array.txt"));
int m = 3;
int n = 5;
int[][] a = new int[m][n];
while (input.hasNextLine()) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
try{// System.out.println("number is ");
a[i][j] = input.nextInt();
System.out.println("number is "+ a[i][j]);
}
catch (java.util.NoSuchElementException e) {
// e.printStackTrace();
}
}
} //print the input matrix
System.out.println("The input sorted matrix is : ");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.println(a[i][j]);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
我知道在没有处理异常的情况下进行捕获但是临时工作。 请注意我将文件放在源文件夹之外。
答案 4 :(得分:-1)
您可以尝试使用Guava,
public class MatrixFile {
private final int[][] matrix;
public MatrixFile(String filepath) {
// since we don't know how many rows there is going to be, we will
// create a list to hold dynamic arrays instead
List<int[]> dynamicMatrix = Lists.newArrayList();
try {
// use Guava to read file from resources folder
String content = Resources.toString(
Resources.getResource(filepath),
Charsets.UTF_8
);
Arrays.stream(content.split("\n"))
.forEach(line -> {
dynamicMatrix.add(
Arrays.stream(line.split(" "))
.mapToInt(Integer::parseInt)
.toArray()
);
});
} catch (IOException e) {
// in case of error, always log error!
System.err.println("MatrixFile has trouble reading file");
e.printStackTrace();
}
matrix = dynamicMatrix.stream().toArray(int[][]::new);
}