使用可能或可能由空格描述的整数读取文件

时间:2016-04-15 22:11:19

标签: java file java.util.scanner

所以我这个文件只用整数填充。我想,如果可能的话,能够读取一个文件,该文件可能有也可能没有空格来描述每个整数。

以下是两个视觉示例。

第一个是不用空格描述的整数,而第二个是。

第一个例子:

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

1 个答案:

答案 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的简单性:告诉用户他们必须提供一个以空格分隔的文件。然后,您可以提供一个实用程序类,将非分隔文件转换为以空格分隔的文件。