прочитайте файл char за char и найдите в нем входную строку - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть файл, который мне нужно прочитать символ за символом и найти строку ввода.Мне нужно вернуть, сколько раз «входная строка» появляется в файле, но мне нужно читать файл символьно только за символом.

Я придумал приведенный ниже код, но у меня возникли проблемы с выяснением, как найти строку вфайл, читая char за char.Сначала я выполнял цикл для цикла, а затем внутри цикла while, но если char не совпадает, мне нужно начать снова с цикла for, и я не могу понять, как я могу это сделать?

  public static void main(String[] args) throws IOException {
    String input = "hello world"; // "hello";
    handleFile(new File("some_file"), input);
  }

  private static int handleFile(File file, String input) throws IOException {
    int count = 0;
    try (BufferedReader br =
        new BufferedReader(new InputStreamReader(new FileInputStream(file),
            Charset.forName("UTF-8")))) {
      char[] arr = input.toCharArray();
      int r;

      // confuse here what logic I should have here?
      for (char a : arr) {
        while ((r = br.read()) != -1) {
          char ch = (char) r;
          if (ch == a) {
            break;
          }
        }
      }
    }

    return count;
  }

1 Ответ

0 голосов
/ 20 декабря 2018

Таким образом, концептуально вам необходимо поддерживать смещение количества совпавших символов, каждый раз, когда возникает несоответствие, вы сбрасываете смещение обратно на 0.Это смещение используется, чтобы определить, соответствует ли данный символ на входе следующему символу в файле

Простая реализация может выглядеть примерно так ...

String value = "Thistestistestatesttest";
String input = "test";

int offset = 0;
int matches = 0;
for (char next : value.toCharArray()) {
    if (next == input.charAt(offset)) {
        offset++;
        if (offset == input.length()) {
            matches++;
            offset = 0;
        }
    } else {
        offset = 0;
    }
}
System.out.println("Found " + matches);

Обратите внимание, я имеюсознательно использовал String в качестве источника, так что вы можете проверить его и лучше понять, как он работает, и использовать логику для реализации своего собственного решения.

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

+======+========+==============+=======+x
| Next | offset | offset value | match |
+======+========+==============+=======+
| T    |      0 | t            | false |
+------+--------+--------------+-------+
| h    |      0 | t            | false |
+------+--------+--------------+-------+
| i    |      0 | t            | false |
+------+--------+--------------+-------+
| s    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| i    |      0 | t            | false |
+------+--------+--------------+-------+
| s    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| a    |      0 | t            | false |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
| t    |      0 | t            | true  |
+------+--------+--------------+-------+
| e    |      1 | e            | true  |
+------+--------+--------------+-------+
| s    |      2 | s            | true  |
+------+--------+--------------+-------+
| t    |      3 | t            | true  |
+------+--------+--------------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...