Мой цикл заполняет мой массив числом семь, шесть раз, почему? - PullRequest
0 голосов
/ 29 ноября 2018

Я пишу программу для чтения в файле и сохранения строк в массиве и массивах.Файл содержит строки и целые числа в формате: String int

У меня уже есть секция строк для работы, я хочу знать, почему следующий код заполняет мой массив числом 7, скорее шесть разчем правильные цифры.Правильный вывод: 12, 14, 16, 31, 42, 7, но, как я уже сказал, он дает, 7, 7, 7, 7, 7, 7

Код:

BufferedReader buffy = new BufferedReader(new FileReader(fileName));
     while((str = buffy.readLine()) != null) {
        for(int i = 0; i <= arrayInt.length - 1; i++) {
           for(int k = 0; k <= str.length()-1; k++) {
              if(str.substring(k, k + 1).equals(" ")) {
                 String nums = str.substring(k+1);
                 arrayInt[i] = Integer.parseInt(nums);
              }
           }
        }
     }
     buffy.close();

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

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Чтение файлов, как правило, выполняется в пакетном режиме / ETL, и если этот код собирается в производство и будет использоваться несколько раз, а не только один раз, то я бы хотел подчеркнуть Производительность и простота обслуживания :

Только чтение минимальных символов для определения индекса пробела

  • @ talex добавил очень хорошую строку кода, т.е. break; внутри цикла, так что вам не нужно будет читать доконец строки, но это будет работать, только если строка не имеет пробелов.Если строка может содержать пробелы, то вам понадобится lastIndexOf пробел (" ") или вовсе не break;.
  • Я предпочитаю использовать метод фреймворка lastIndexOf, предполагая, что вы используете Java, потому что:

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

      int k = str.lastIndexOf(" ");

    3. последнее, но не менее важное, если кто-то другой собирается сохранить этот код, ему будет легче, так как будет достаточно документации.

Чтение только необходимых строк из файлов

Похоже, вам нужно только определенное количество строк для чтения arrayInt.length, если это так, то вы должны 'прервать;'цикл while, если счетчик i больше длины массива.

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

Не забудьте try-catch-finally

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

См. пример ниже:

    private Integer[] readNumbers(String fileName) throws Exception {
        Integer[] arrayInt = new Integer[7];
        String str = null;
        BufferedReader buffy = new BufferedReader(new FileReader(fileName));
        try {
            int i=0;
            while ((str = buffy.readLine()) != null) {
                if(i> arrayInt.length){
                    break;
                }
                //get last index of " "
                int k = str.lastIndexOf(" ");
                if(k > -1){
                    String nums = str.substring(k+1);
                    arrayInt[i] = Integer.parseInt(nums);
                }
                //increment the line counter
                i++;
            }
        } catch (Exception ex) {
            //handle exception
        } finally {
            buffy.close();
        }
        return arrayInt;
    }
0 голосов
/ 29 ноября 2018

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

Попробуйте это:

 int i = 0;
 BufferedReader buffy = new BufferedReader(new FileReader(fileName));
 while((str = buffy.readLine()) != null) {
    if(i < arrayInt.length) {
       for(int k = 0; k <= str.length()-1; k++) {
          if(str.substring(k, k + 1).equals(" ")) {
             String nums = str.substring(k+1);
             arrayInt[i] = Integer.parseInt(nums);
             break;
          }
       }
       i++;
    }
 }
 buffy.close();

Также вы можете использовать indexOf

 int i = 0;
 BufferedReader buffy = new BufferedReader(new FileReader(fileName));
 while((str = buffy.readLine()) != null) {
    if(i < arrayInt.length) {
       int k = str.indexOf(" ");
       if(k!=-1) {
          String nums = str.substring(k+1);
          arrayInt[i] = Integer.parseInt(nums);
       }
       i++;
    }
 }
 buffy.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...