扫描仪未按预期计算空格

时间:2018-09-02 11:56:51

标签: java java.util.scanner

我目前正在尝试使用扫描仪为推箱子游戏创建求解器,我现在遇到的问题是我的扫描仪无法正常工作,通常我的文本文件看起来像这个:

## ###### #
##### #####

当我尝试使用代码时,我想扫描每个字符,包括空格,保存它们,创建2D数组,然后将它们放在其中,这是我的第一步。问题是我的扫描仪没有像我希望的那样担心,我使用以下行:

sc.useDelimiter("s*");

这是我尝试计算空格的问题,似乎确实如此,问题在于每次输入空格时都会切换行。我的代码现在看起来像:

    package soko;

    import java.util.*;


    import java.io.*;

    public class Dowork {
        File file;
        Scanner sc;
        char a;
        static int lines;
        Scanner lineScanner;
        static int maxChar;
        ArrayList array;
        char[][] array2;
        Scanner bc;
        int n;
        int m;
        static int lines2;


    public Dowork() throws Exception{
        //lines += 1;
        file = new File("C:/Users/joaki/Desktop/sokoban/readin.txt");
        sc = new Scanner(file);
        bc = new Scanner(file);
        sc.reset();
        bc.reset();
        sc.useDelimiter("s*");
        ArrayList<Character> array = new ArrayList<Character>();
        while(sc.hasNext()) {
            String line = sc.next();
            if(maxChar <= line.length()) {
                maxChar = line.length();
            }
            for (char ch:line.toCharArray()) {
                array.add(ch);
            }
            if(sc.hasNextLine()) {
                lines++;
            }

        }
        sc.close();
        while(bc.hasNextLine()) {
            lines2++;
        }
        bc.close();
        array2 = new char[lines][maxChar];
        Iterator<Character> itemIterator = array.iterator();
            while(itemIterator.hasNext()) {
                itemIterator.next();
                for (int q = 0; q < lines; q++) {
                    for(int r = 0; r < maxChar; r++) {
                        Character j = itemIterator.next();
                        array2[q][r] = j;

                    }
                }

            }
            for (int q = 0; q < lines; q++) {
                for(int r = 0; r < maxChar; r++) {
                    System.out.println(array2[q][r]);
                }
            }


        }


    public static void main(String[] args) throws Exception{
        Dowork g = new Dowork();
        System.out.println(lines2);

    }
}

举个例子,当我使用具有以下内容的txt文件时:

########
#   # .#
#   $$.#
####   #
   #@ ##
   ####

它计算的行数为56,显然不应该是56。我在哪里做错了?

1 个答案:

答案 0 :(得分:2)

要记住的主要编程规则之一:保持简单

请注意,为什么不简单使用普通的普通扫描程序(其分隔符未更改),并使用它来获取行,而仅从文件中获取行。然后,您可以根据需要处理这些行,例如转换为char数组,或者根据需要使用自己的行Scanner对其进行解析。

List<String> lines = new ArrayList<>();
while (sc.hasNextLine()) {
    lines.add(sc.nextLine());
}

array2 = new char[lines.size()][];
for (int i = 0; i < array2.length; i++) {
    array2[i] = lines.get(i).toCharArray();
}

例如:

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import java.util.Scanner;

public class DoWork2 {
    // assuming data in data.txt file in same path as class files
    private static final String RESRC_PATH = "data.txt";
    private char[][] array2;

    public DoWork2(String resrcPath) {
        InputStream is = getClass().getResourceAsStream(resrcPath);
        Scanner sc = new Scanner(is);
        List<String> lines = new ArrayList<>();
        while (sc.hasNextLine()) {
            lines.add(sc.nextLine());
        }

        array2 = new char[lines.size()][];
        for (int i = 0; i < array2.length; i++) {
            array2[i] = lines.get(i).toCharArray();
        }
        if (sc != null) {
            sc.close();
        }
    }

    public String getLines2() {
        StringBuilder sb = new StringBuilder();
        Formatter formatter = new Formatter(sb);
        for (char[] cs : array2) {
            formatter.format("%s%n", new String(cs));
        }
        formatter.close();
        return sb.toString();
    }

    public static void main(String[] args) {
        DoWork2 doWork2 = new DoWork2(RESRC_PATH);
        System.out.println(doWork2.getLines2());
    }

}