Я попытался реализовать функциональность команды "имя файла wc" в Linux. Эта команда считает количество:

  • линии
  • слова
  • байтов

В файле.

Вот мой код:

public class wc {
    public static void main(String[] args) throws IOException {
    //counters
    int charsCount = 0;
    int wordsCount = 0;
    int linesCount = 0;

    Scanner in = null;

    try(Scanner scanner = new Scanner(new BufferedReader(new FileReader(new File("Sample.txt"))))){
        File file = new File("Sample.txt");

        while (scanner.hasNextLine()) {

            String tmpStr = scanner.nextLine();
            if (!tmpStr.equalsIgnoreCase("")) {
                String replaceAll = tmpStr.replaceAll("\\s+", "");
                charsCount += replaceAll.length();
                wordsCount += tmpStr.split(" ").length;
            }
            ++linesCount;
        }

    System.out.println("# of chars: " + charsCount);
    System.out.println("# of words: " + wordsCount);
    System.out.println("# of lines: " + linesCount);
    System.out.println("# of bytes: " + file.length());

    }
  }
}

Проблема в том, что в файле есть такой текст:

Hex Description                 Hex Description

20  SPACE
21  EXCLAMATION MARK            A1  INVERTED EXCLAMATION MARK
22  QUOTATION MARK              A2  CENT SIGN
23  NUMBER SIGN                 A3  POUND SIGN

Есть несколько пробелов разной длины. Иногда вдвое, иногда больше. Как реорганизовать мой код для правильного подсчета слов? Как избавиться от нескольких пробелов?

2
JeyKey 8 Сен 2017 в 20:40

3 ответа

Лучший ответ

{{X0 }} принимает регулярное выражение, поэтому вы можете просто разделить на \\s+ (несколько пробелов):

public static void main (String[] args) {
    String input = "Some input  with     more     than   one   space";
    String[] words = input.split("\\s+");
    System.out.println(words.length + " words");
}

Выход:

7 words

См. на сайте ideone.com.

3
Marvin 8 Сен 2017 в 17:48

@ Марвин уже предложил решение здесь.

Это еще один способ разделения строк, имеющих несколько пробелов.

s.split ("[] +")

Также должен нормально работать для вас.

Примере

String s="This is     my test    file.";
String s1[]=s.split("[ ]+");
System.out.println(s1.length);

Выход:-

5
0
nagendra547 8 Сен 2017 в 18:33

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

tmpStr.split("\\s+")
0
assylias 8 Сен 2017 в 17:43