Java Читать алфавит из файла в многомерный массив - PullRequest
0 голосов
/ 29 октября 2018

Это определенно логическая проблема в первую очередь, но я не могу решить, как решить эту проблему:

У меня есть файл .txt, который я читаю со всем алфавитом, состоящим из 1 и 0, например, это B, за которым следует C в TXT-файле:

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

    }

В моей голове алгоритм будет идти: Считайте данные и добавляйте к строке до пустой строки, затем увеличивайте до следующей буквы.

Но я не могу понять, как перевести это в код. Кажется, я не могу понять, как продолжать читать блок одной буквы до пустой строки.

1 Ответ

0 голосов
/ 29 октября 2018
  1. Файл достаточно мал, чтобы его можно было загрузить в память. Java 7 nio имеет метод с одной строкой, который делает это.

  2. Работать с List с гораздо проще, чем с массивами, поскольку они автоматически растут при вставке данных. вы конвертируете массивы в список и наоборот при необходимости.

Вот мое решение:

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