所以我这个文件只用整数填充。我想,如果可能的话,能够读取一个文件,该文件可能有也可能没有空格来描述每个整数。
以下是两个视觉示例。
第一个是不用空格描述的整数,而第二个是。
第一个例子:
020030090
000907000
900208005
004806500
607000208
003102900
800605007
000309000
030020050
第二个例子:
0 3 8 0 12 0 15 16 6 0 4 0 0 0 0 0
0 11 5 0 1 0 0 14 13 0 3 9 12 7 0 0
0 0 0 0 6 0 0 0 0 12 0 14 0 0 0 16
10 16 0 6 2 13 0 0 0 8 7 0 0 0 0 0
3 10 1 0 13 0 0 15 0 9 0 16 5 0 0 0
0 0 16 0 0 0 0 11 14 0 13 12 0 3 0 0
4 0 7 8 0 0 12 9 0 0 0 0 0 0 11 0
0 6 0 0 16 0 0 0 11 5 0 0 15 0 0 2
11 0 0 12 0 0 8 2 0 0 0 1 0 0 14 0
0 7 0 0 0 0 0 0 3 11 0 0 8 16 0 9
0 0 13 0 3 6 0 7 16 0 0 0 0 11 0 0
0 0 0 2 5 0 14 0 15 0 0 4 0 13 7 1
0 0 0 0 0 14 5 0 0 0 16 2 13 0 8 10
14 0 0 0 8 0 9 0 0 0 0 11 0 0 0 0
0 0 6 15 7 1 0 3 12 0 0 13 0 2 5 0
0 0 0 0 0 15 0 12 1 14 0 3 0 6 16 0
注意:
我还想补充一点,第二个文件可能没有相同的数量。这意味着一个整数后面可以有一个空格,另一个整数后面可以有10个空格。
我尝试了什么:
我尝试将拆分(" \ s +")与 replaceAll("",&#34)结合使用;")但这在第二个例子中不起作用,因为它会有更多空格,因此分割功能不起作用。
我尝试过使用 replaceAll("",""),这样他们根本没有空格。然后我将字符串转换为char数组,但是出现了大于一位数的整数问题(也不适用于第二个例子)。
代码:
public void initializeGrid(int grid[][], String fileName) throws FileNotFoundException, IOException
{
Scanner read = new Scanner(Paths.get(fileName));
int value;
for (int i = 0; i < ROWS; i++)
{
String line = read.nextLine();
String [] numbers = line.trim().split("\\s+");
for (int j = 0; j < COLUMNS; j++)
{
value = Integer.parseInt(numbers[j]);
grid[i][j] = value;
}
}
}
答案 0 :(得分:1)
根据上面评论中@dnault的建议,这里有一个使用Java Collection
框架而不是2d int
数组的实现。这种方法优于2d数组,因为每行的List
包含所需数量的条目。使用数组,如果一行的值小于COLUMN
,则该数组将包含所有剩余值的零。
public List<List<Integer>> readFile(String fileName)
throws FileNotFoundException, IOException {
BufferedReader br = Files.newBufferedReader(Paths.get(fileName));
List<List<Integer>> values = new ArrayList<>();
for(String line; (line = br.readLine()) != null;){
String[] splitLine = line.trim().split("\\s+");
if(splitLine.length < 2)
values.add(parseSingleDigitValues(splitLine[0].toCharArray()));
else
values.add(parseDelimitedValues(splitLine));
}
return values;
}
private List<Integer> parseSingleDigitValues(char[] line) {
List<Integer> values = new ArrayList<>();
for(char c: line){
values.add(Integer.parseInt(String.valueOf(c)));
}
return values;
}
private List<Integer> parseDelimitedValues(String[] line) {
List<Integer> values = new ArrayList<>();
for(String str :line)
values.add(Integer.parseInt(str));
return values;
}
然后可以使用以下方法将生成的List<List<Integer>>
轻松转换为2D int
数组:
private int[][] asArray(List<List<Integer>> lists){
int s1 = lists.size();
int s2 = 0;
for(List<Integer> sublist : lists){
if(sublist.size() > s2)
s2 = sublist.size();
}
int[][] arr = new int[s1][s2];
for(int i = 0; i < lists.size(); i++){
List<Integer> sublist = lists.get(i);
for(int j = 0; j < sublist.size(); j++){
arr[i][j] = sublist.get(j);
}
}
return arr;
}
编辑最后,如果您清楚地记录了您的代码/ api,那么用户可以负担得起正确使用的负担。我建议您选择API的简单性:告诉用户他们必须提供一个以空格分隔的文件。然后,您可以提供一个实用程序类,将非分隔文件转换为以空格分隔的文件。