Java 读取包含整数的文件,这些整数可以用空格表示,也可以用空格表示

Java 读取包含整数的文件,这些整数可以用空格表示,也可以用空格表示,java,file,java.util.scanner,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

所以我有一个只填充整数的文件。如果可能的话,我希望能够读取一个文件,该文件可能包含也可能不包含描述每个整数的空格

这里有两个可视示例

第一个是不用空格表示的整数,而第二个是用空格表示的整数

第一个示例:

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
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;
            }
        }
}
第二个示例:

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
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;
            }
        }
}
注意:

我还想补充一点,第二份文件可能没有同样的数额。这意味着一个整数后面可以有一个空格,另一个整数后面可以有10个空格

我尝试过的:

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
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;
            }
        }
}
我曾尝试将拆分(“\s+”替换所有(“,”)结合使用,但在第二个示例中,这不起作用,因为它会有更多的空间,因此拆分函数不起作用

我曾经尝试过像这样使用replaceAll(“,”),这样它们就没有空格了。然后,我将字符串转换为字符数组,但如果整数大于一位,则会出现问题(第二个示例也不适用)

代码:

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
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;
            }
        }
}
public void initializeGrid(int grid[],String fileName)抛出FileNotFoundException,IOException
{
扫描器读取=新扫描器(path.get(fileName));
int值;
对于(int i=0;i
根据上面评论中@dnault的建议,下面是一个使用Java
集合
框架而不是2d
int
数组的实现。这种方法与2d数组相比有一个优势,即每行的
列表
包含所需数量的条目。使用数组时,如果一行的值小于
值,则该数组将包含所有剩余值的零

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

编辑最后,如果你清楚地记录了你的代码/api,那么正确使用它的负担就在用户身上。我建议您在API中选择简单:告诉用户他们必须提供一个以空格分隔的文件。然后,您可以提供一个实用程序类,将非分隔文件转换为以空格分隔的文件。

如果整数没有分隔,您如何知道一个结束点和下一个开始点在哪里?@dnault我知道这是一个问题,但当用户输入文件路径时,我如何知道每个整数都由空格分隔?这就是为什么我一开始就说这是可能的。不用担心这种情况会容易得多,但如果不能,我想处理这种情况,因为两个文件都是有效的。哦,我明白了。在第一种情况下,每个整数保证在
[0-9]
范围内。当整数可能大于9时,第二种情况是必需的。@dnault没错,现在你看到我的问题了。@LuisAverhoff dnault的想法正确吗?如果被分隔,那么我们假设所有值都在
[0-9]
之间;否则,没有限制?这正是我心里想的。只是我不想让用户输入一个没有空格的文件,让他们看到它不正常工作,但我想告诉他们必须用空格来描述它就足够了。这就是API文档应该做的——告诉用户如何使用API。只要有明确的文档记录,用户就有责任遵循您的指导原则。如果您决定要求使用空格分隔符,我建议您在未使用空格或未正确使用空格(在任何时候)时引发异常。这将有助于用户在调试过程中尽早识别问题。