【问题标题】:Java Read alphabet from file to multi-dimensional arrayJava从文件读取字母到多维数组
【发布时间】:2018-10-29 07:04:33
【问题描述】:

这绝对是一个逻辑问题,但我似乎无法解决这个问题:

我有一个 .txt 文件,我正在读入由 1 和 0 组成的整个字母表,例如,在 .txt 文件中这是一个 B 后跟一个 C:

0 0 1 1 1 1 0 0 0
0 0 1 0 0 0 1 0 0
0 0 1 1 1 1 0 0 0
0 0 1 0 0 0 1 0 0
0 0 1 1 1 1 0 0 0

0 0 0 1 1 1 0 0 0
0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0

您可以按照 1 来辨认字母。 我需要做的是将这些字母中的每一个读入一个数组字母表中,每个字母都由一个空行分隔,并且字母必须遵循这种格式。这是一个 5x9 的数字矩阵,我需要将其转换为 45 x 1 数组并将其存储在 26 个字母的字母数组中。

这是一个光学字符识别神经网络,我必须使用硬编码数字,但从文件中读取数据已被证明是技巧。

这是我目前所拥有的:

String[][] alphabet = new String[26][45];
    float [][] trainingDataFile = new float[26][45];
    int row = 0;

    Scanner file = new Scanner(new BufferedReader(new FileReader("Alphabet.txt")));
    /*
        While the file has another line, read in data until empty line. 
    */
    while(file.hasNextLine())
    {

        String line = file.nextLine();
        if(line.length() != 0)
        {
            String[] letters = line.split(" ");
            alphabet[row] = letters;

        } else {
            row++;
        }

    }

在我的脑海中,算法会: 读入数据并追加到字符串直到空行然后递增到下一个字母。

但我不知道如何将其转换为代码。 我似乎无法弄清楚如何继续阅读单个字母的块直到一个空行。

【问题讨论】:

    标签: java arrays logic


    【解决方案1】:
    1. 文件足够小,可以加载到内存中。 Java 7 nio 有一个单行方法可以做到这一点。

    2. 使用Lists 比使用数组要容易得多,因为它们会随着数据的插入而自动增长。您可以根据需要将数组转换为列表,反之亦然。

    这是我的解决方案:

        String[][] alphabet = new String[26][45];
    
        try {
            // read the entire file into memory
            List<String> lines = Files.readAllLines(Paths.get("C://temp/xx.txt"));
            // this will hold 45x1 array as list
            List<String> concatenated = new ArrayList<>();
            int row = 0;
            for (String line : lines) {
                if (line.isEmpty()) {
                    // convert list to array and add to matrix
                    alphabet[row] = concatenated.toArray(alphabet[row]);
                    concatenated = new ArrayList<>();
                    row++;
                } else {
                    // convert result of split() to list and add to letter list
                    concatenated.addAll(Arrays.asList(line.split(" ")));
                }
            }
            // take care of last letter
            alphabet[row] = concatenated.toArray(alphabet[row]);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Arrays.stream(alphabet).forEach(row -> System.out.println(Arrays.toString(row)));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多