#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(...)
возвращает aString
, а у aString
нет метода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());