Почему мой метод не определен для типа java.lang.Строка

#java #string #counter #separator

#java #строка #счетчик #разделитель

Вопрос:

У меня есть класс синтаксического анализатора, который принимает список строк и выводит их построчно. Я хочу, чтобы метод linecount() (который не принимает никаких параметров) выводил общее количество строк, т.е.:

 import java.util.*;

public class Parser{
  private 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("[rn]")).length;
  }
}
  

Таким образом, когда список строк задается как: List lines = Arrays.asList(new String[]{"one", "two three", ""}) , вызов Parser.parse(lines) даст вам

 one
two three

  

и, следовательно, Parser.parse(lines).linecount() должен выводиться 3 . Однако я столкнулся с ошибкой The method linecount() is undefined for the type java.lang.String . Почему это так?

Комментарии:

1. Потому что вам нужно вызвать Parser.linecount() , а не [код не показан, но, вероятно, какая-то строка].linecount() . В любом случае это кажется ужасной идеей, потому что выполнение статического типа предотвратит повторное использование вашего кода. Вы должны сделать его объектом с переменными экземпляра и методами объекта.

2. lines будет равно нулю linecount() . Вам нужно установить его в parse методе. Во-вторых, вы вызываете linecount для строки? Вы должны вызвать его при разборе. вот так Parser.linecount() .

3. Parser.parse(...) возвращает a String , а у a String нет метода linecount .

4. Вы пытаетесь вызвать linecount экземпляр java.lang.String , но linecount это статический метод в вашем Parser классе … кстати, ваше использование static здесь очень неправильно, поскольку у этого есть состояние, которое должно быть частью экземпляра.

Ответ №1:

 Parser.parse(lines).linecount();//<--------- Here is the problem
  

Parser.parse() возвращает String и linecount() является статической функцией Parser класса. Это не функция String класса. вы не можете вызвать таким образом Parser.parse(lines).linecount() , и именно поэтому он выдает ошибку linecount() is undefined for the type java.lang.String . вы должны вызывать отдельно.

 Parser.parse(lines);
Parser.linecount();
  

И вы должны заполнить List<String> lines объект перед вызовом linecount() .

Ваше регулярное выражение также неверно. Заменить "[rn]" на "[\r | \n]" . Вывод программы указан в конце.

 import java.util.Arrays;
import java.util.List;

public class Parser {

  private 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 void main(String[] args) {
    lines = Arrays.asList("one", "two three", "");
    lines.forEach(System.out::println);
    int count = Parser.linecount();
    System.out.println(count);
  }
}
  

Вывод :

 one
two three

3
  

Ответ №2:

 import java.util.*;

public class Parser{
  private List<String> lines;

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

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

main()

 Parser p = new Parse();
List lines = p.parse(Arrays.asList(new String[]{"one", "two three", ""}));
System.out.println(lines);

System.out.println(p.linecount());