Имеется строка в которой может присутствовать любой один из пяти символов: & или @ или + или * или %
Например: In&Out, White@Black, 100+500 и так далее.
Как мне узнать, какой один из пяти возможных символов присутствует в ведённой строке, чтобы затем разбить эту строку на три подстроки и сохранить в переменных:
operand1 = до символа, operator = символ и operand2 = после символа
Пытался сделать так:
public static void main(String[] args) {
String operand1;
String operand2;
String operator;
char ch;
String inputString = "White@Black";
int lengthInputString;
lengthInputString = inputString.length();
for (int i = 0; i < lengthInputString; i++) {
ch = inputString.charAt(i);
if (ch == '&' || ch == '@' || ch == '+' || ch == '*'|| ch == '%') {
operator = String.valueOf(ch)
}
}
}
Получается очень некрасиво.
Если хочется красиво - тогда лучше сразу разбивать по регулярному выражению [@+&*%]
:
public static void main(String[] args) {
String str = "123&abcd";
String[] pair = str.split("[@+&*%]");
if (pair.length == 1)
return;
String delim = str.substring(pair[0].length(), str.length() - pair[1].length());
System.out.println(pair[0]); // 123
System.out.println(delim); // &
System.out.println(pair[1]); // abcd
}
class Example {
private static final char[] DELIMITERS = { '&', '@', '+', '-', '/', '*', '%' };
private static String extractDelimiter(String s) {
for (char c : DELIMITERS) {
if (s.indexOf(c) != -1)
return String.valueOf(c);
}
return null;
}
public static void main(String[] args) {
String operator = extractDelimiter("White@Black");
}
}
Если вам нужен чистый код, то можно сделать так:
private static final char[] DELIMITERS = {'&', '@', '+', '*', '%'};
public static void main(String[] args) {
String input = "White@Black", operand1, operator, operand2;
for (char c : DELIMITERS) {
int index = input.indexOf(c);
if(index != -1) {
operand1 = input.substring(0, index);
operator = String.valueOf(c);
operand2 = input.substring(index + 1);
break;
}
}
}
Хотя ваш вариант в целом неплох и намного быстрее с точки зрения производительности, чем предыдущий. А если его записать следующим образом, то выглядит довольно чисто, правда, кода больше.
private static final char[] DELIMITERS = {'&', '@', '+', '*', '%'};
private static boolean isDelimeter(char c) {
for (char delimiter : DELIMITERS)
if(c == delimiter)
return true;
return false;
}
public static void main(String[] args) {
String input = "White@Black", operand1, operator, operand2;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (isDelimeter(c)) {
operand1 = input.substring(0, i);
operator = String.valueOf(c);
operand2 = input.substring(i + 1);
break;
}
}
}
/**
* Функция возвращает массив индексов искомого элемента в строке или -1, если таков не найден
*
* @param pattern
* @param text
* @return
*/
public static int[] regExIndex(String pattern, String text, Integer fromIndex){
Matcher matcher = Pattern.compile(pattern).matcher(text);
if ( ( fromIndex != null && matcher.find(fromIndex) ) || matcher.find()) {
return new int[]{matcher.start(), matcher.end()};
}
return new int[]{-1, -1};
}
public static void main(String[] args) {
// группа разделителей в (), разделённых между собой |
final String delimeters = "(&|@|\\+|\\*|%)";
String sourceText = "abc%zxcv";
String[] groups = new String[3];
int[] result = regExIndex(delimeters, sourceText, 0);
if ( result[0]>=0 ){
groups[0] = sourceText.substring(0, result[0]);
groups[1] = sourceText.substring(result[0], result[0]+1);
groups[2] = sourceText.substring(result[0]+1);
System.out.println(groups[0]);
System.out.println(groups[1]);
System.out.println(groups[2]);
} else
System.out.println("Nothing not found.");
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я хочу добавить PNG-изображение в PDF-файл, но я знаю, что PDF не поддерживает PNG-файлыЗначит ли это, что я не могу использовать PNG-файлы в iText?
No IDEA annotations attached to the JDK 18 (D:\Program Files\Java\jdk1
В интернете просмотрел уже кучу всего и про Angular, и про NodeJS с Express, и про MongoDB, но вот как объединить их вместе без танцев с бубном не могу отыскатьЯ...
Нужно обрезать число поле второго знака после запятой, но в зависимосити от локали разделитель может быть разный