Делаю калькулятор. Дело дошло до разбиения на "слова". И вот хочу применить StringTokenizer или более современный аналог для разбиения выражения на слова с учётом определённого списка разделителей.
String delimeters = {"+", "-", "*", "/", "^", "==", "&&", "||", " "}; //Разделитли
StringTokenizer st = new StringTokenizer("регулярное выражение сформированное из delimeters", true);
while (st.hasMoreTokens()) {
tokens.add(st.nextToken());
}
Как вы заметили разделитель может состоять из нескольких символов.
Пример :
String delimeters[] = {"+", "-", "*", "/", "^", "&&", "||", "==", "(", ")"}
List<String> separated = split("true||false==(false||true)", delimeters);
for (int i = 0; i < separated.length; i++)
System.out.println(separated.get(i));
Должна напечатать :
true
||
false
==
(
false
||
true
)
https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html
StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
В вашем случае более правильным будет использовать простой проход по строке (ну или можно заморочиться реализацией конечного автомата)
На скорую руку
public class Tokenizer {
private List<String> tokens = new ArrayList<>();
private String currentToken = "";
public List<String> tokenize() {
String inputString = "true||false==(false||true)";
Set<String> delimiters = new HashSet<>(Arrays.asList("+", "-", "*", "/", "^", " ", "(", ")", "==", "&&", "||"));
int length = inputString.length();
for (int i = 0; i < length; i++) {
String one = inputString.substring(i, i + 1);
String two = i < length - 1 ? inputString.substring(i, i + 2) : "fake delimiter";
if (delimiters.contains(one)) {
addTokens(one);
continue;
}
if (delimiters.contains(two)) {
addTokens(two);
i++;
continue;
}
currentToken += one;
}
if (!currentToken.equals("")) tokens.add(currentToken);
return tokens;
}
private void addTokens(String delimiter) {
if (!currentToken.equals("")) {
tokens.add(currentToken);
}
tokens.add(delimiter);
currentToken = "";
}
}
ideone
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости