Как подсчитать количество слов и строк в строке, разделенной System.lineSeparator()?

У меня есть класс Parser, который принимает List<String> lines в качестве своего поля. Я пытаюсь создать метод linecount() и wordcount() для вывода количества строк и слов соответственно.

Вот что у меня есть:

import java.util.*;

public class Parser{
  static List<String> lines;

  public static String parse(List<String> lines){
    return String.join(System.lineSeparator(), lines); 
  }

  public static int linecount(){
    String newString = String.join(System.lineSeparator(), lines); 
    return newString.split("[\r\n]").length;
  }

  public static int wordcount(){
    String[] newStringArr = String.split("[\r\n]");
    int counter = (String.split("[\r\n]")).length;
    for (String a : newStringArr){
      counter = counter + (a.length() - a.replaceAll(" ", "").length());
    return counter;
  }
}

Учитывая мой список строк: List lines = Arrays.asList(new String[]{"one", "two three", ""})

если я вызову метод Parser.parse(lines).linecount(), я должен получить результат 3, и метод Parser.parse(lines).wordcount() также должен дать мне результат 3. Однако я получаю сообщение об ошибке. Могу ли я узнать, как это решить?

Это ошибки, которые я получаю:

Error: Cannot make a static reference to the non-static method split(java.lang.String) from the type java.lang.String

Error: Cannot make a static reference to the non-static method split(java.lang.String) from the type java.lang.String

Error: Cannot make a static reference to the non-static method split(java.lang.String) from the type java.lang.String

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
86
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

  public static int linecount(){
    return (String.split("[\r\n]")).length;
  }

Вы можете попробовать это:

private static String array;

public static void parse(List<String> lines){
    array = String.join(System.lineSeparator(), lines); 
}

public static int lines(){
    return (array.split("[\r\n]")).length;
}

public static int words() {
    String[] newStringArr = array.split("[\r\n]");
    int counter = (array.split("[\r\n]")).length;
    for (String a : newStringArr){
      counter = counter + (a.length() - a.replaceAll(" ", "").length());
    }
    return counter;
}

public static void main(String[] args) {
    List<String> lines = Arrays.asList(new String[]{"one", "two three", ""});
    LineCounter.parse(lines);
    System.out.println(LineCounter.lines());
    System.out.println(LineCounter.words());
}

Привет, это тоже работает, но есть ли способ сделать это без функции LineCounter и только с помощью методов linecount() и wordcount()? :)

squirrel 11.04.2019 12:34
Ответ принят как подходящий

Это происходит потому, что split() класса Нить не является статический. Посмотрите внимательно на сигнатуру метода из файла Java-документы.

public String[] split(String regex)

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

Может быть, вам это нужно?

public static int wordcount(String myString) {
    String[] newStringArr = myString.split("[\r\n]");
    int counter = myString.split("[\r\n]").length;
    for (String a : newStringArr) {
        counter = counter + (a.length() - a.replaceAll(" ", "").length());
    }
    return counter;
}

Передайте аргумент Нить в wordCount(), а затем выполните над ним операцию расколоть. Кроме того, вам не хватило закрывающей скобки.

Что ты тут делишь..? Ты понимаешь, что не умеешь писать String.split(..) . вам нужно вызвать split на object ( string ), чтобы разделить его. почему бы вам не попробовать что-то вроде:

public static int getWordCount(String lines){
return lines.split(" |\n").length;//based on word separator <space>  and \n

}

    public static void main(String[] args) 
    {
        String nChars = "ABCDEF 12\nBLue";
        System.out.println(getWordCount(nChars));
    }

Другие вопросы по теме