(JAVA) возникли проблемы с подсчетом точного количества строк и других определенных символов в файлах

Итак, у меня есть два файла .txt, один из которых называется «input.txt», а другой — «output.txt». чтобы создать вывод, мне нужно скопировать текст из ввода, но заменить все пробелы между словами на @ и добавить новую строку со строкой «#NEW_LINE#» после каждой строки исходного текста.

например, если input.txt такой:

the unstoppable marching of time
that is slowly guiding us all towards
an inevitable death 

тогда output.txt должен быть примерно таким:

the@unstoppable@marching@of@time
#NEW_LINE#
that@is@slowly@guiding@us@all@towards
#NEW_LINE#
an@inevitable@death 
#NEW_LINE#

в любом случае вы поняли идею.

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

вот часть кода, который я попробовал сначала: [кстати, все это происходит в одном классе, без каких-либо других методов, кроме основного, конечно. я думал, что так будет проще, idk ????‍♂️????]

  File fsrc=new File("input.txt");         
  File fdes=new File("output.txt");        


  int atCount = 0; //number of @'s
  int lineCountIN=0; //number of input's lines
  int lineCountOUT=0; //number of output's lines

  FileReader fr = new FileReader(fsrc);           
  BufferedReader br =new BufferedReader(fr);

  FileWriter fw = new FileWriter(fdes);
  String s = null;

  while((s=br.readLine())!=null)            
  {
     if ((s.equals(" "))) {
     fw.write(s.replace(" ","@"));
     atCount++; } 
     else fw.write(s);
     fw.write("\n");
     lineCountOUT++;
     lineCountIN++;
     fw.write("#NEW_LINE#");
     fw.write("\n");
     lineCountOUT++;
     fw.flush();  
  }  
  fw.close();

[...]

System.out.println("Total instances of @ characters at output.txt: " + atCount);

сообщение, которое появляется на экране, всегда будет таким: «Всего вхождения символов @ в output.txt: 0».

позже я изменил блок if-else на блок do-while:

do {
         fw.write(s.replace(" ","@"));
         atCount++; } 
     while ((s.equals(" ")));

но тогда сообщение не возвращает точное количество @, на самом деле число, которое оно показывает, по какой-то причине просто равно lineCountIN (например, для файла input.txt с 3 строками, окончательное сообщение это: "Всего экземпляров символов @ в output.txt: 3")

так что да, это в значительной степени это lmao, я думаю, что я неправильно использую atCount?? любая помощь может быть оценена ‹3


person Community    schedule 28.04.2020    source источник
comment
(s.equals(" ")) -> Вы проверяете, равна ли вся строка пробелу. Вы должны найти пробелы внутри s   -  person Olivier Depriester    schedule 28.04.2020
comment
@OlivierDepriester спасибо за ваш комментарий, я попытался написать fw.write(s.replace(" ", "@"));, а затем: for(int i=0; i<s.length();i++){if(s.charAt(i) == '@') atCount++; }, но это все равно не работает, там написано, что 0 @!!   -  person    schedule 28.04.2020


Ответы (1)


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

    public static void main(String[] args) {

        String s  = "the unstoppable marching of time\n" +
                "that is slowly guiding us all towards\n" +
                "an inevitable death";
        int countSpace = 0;
        if (s.contains(" ")) {
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == ' ') {
                    countSpace++;
                }
            }
            s = s.replace(' ', '@');
        }
        System.out.println(s);
        System.out.println(countSpace);

    }
person saiko    schedule 28.04.2020
comment
хорошо, это эпично, я пробовал что-то подобное, и это сработало отлично! спасибо ???? - person ; 28.04.2020