powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Выбрать из строки все числа, кроме 0 и 1
55 сообщений из 55, показаны все 3 страниц
Выбрать из строки все числа, кроме 0 и 1
    #39743512
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Как настроить NUM_PARSER, чтобы выводились все числа, кроме 0 и 1?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
final String NUM_PARSER = "\\d+\\.*,*\\d*";
final String numString = " 1778.89 0 45 987,45 1 ";

Pattern patternNum = Pattern.compile(NUM_PARSER);
Matcher matcherNum = patternNum.matcher(numString);

while (matcherNum.find()) {
    System.out.println(matcherNum.group());
}


Выводит:
Код: java
1.
2.
3.
4.
5.
1778.89
0
45
987,45
1


Нужно:
Код: java
1.
2.
3.
1778.89
45
987,45
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743514
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar, я извиняюсь, что не помогу вас, но у меня есть универсальный ответ на все подобные вопросы - не использовать рег выражения.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743828
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar,

А что делать с числами

001
1,00
1.00
01.00

?


Кстати, символ "," и "." - это только разделители целой и дробной части или какой-то (а то и оба) могут использоваться как разделители групп разрядов (100,000,000)?
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743878
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasar, я извиняюсь, что не помогу вас, но у меня есть универсальный ответ на все подобные вопросы - не использовать рег выражения.ну зачем так категорично?

https://regex101.com/r/uwH1WY/2

https://regex101.com/r/uwH1WY/2/codegen?language=java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(?(?=\\s[1|0]\\s)\\s[0|1]\\s|(\\d+[,|.]\\d+|\\d+))";
final String string = " 1778.89 0 45 987,45 1 5 6 1 ";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743918
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

А так если
Код: java
1.
final String string = " 1778.89 0 1 45 987,45 1 5 6 1 ";


Но вот так будет работать
Код: java
1.
final String string = " 1778.89 0  1 45 987,45 1 5 6 1 ";
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743986
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинка,

https://regex101.com/r/uwH1WY/3

Код: java
1.
final String regex = "(?(?=\\s[10]\\s|[01]\\s)\\s[01]\\s|(\\d+[,.]\\d+|\\d+))";
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743993
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяПылинка,

https://regex101.com/r/uwH1WY/3

Код: java
1.
final String regex = "(?(?=\\s[10]\\s|[01]\\s)\\s[01]\\s|(\\d+[,.]\\d+|\\d+))";



это же непонятная хрень!)) Как в этом разобраться?
никогда не понимал людей, которые используют в яве это.
Рег выражения можно юзать только там, где точно знаешь, что выражения - на года и меняться не будет. А так оно будет только расти и захватывать мозг человека. Не проще ли в цикле перебрать все и отсеять ненужное? Стримы уже придумали, можно
stream().filter().collect() использовать, если уже совсем не по нраву for()
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743997
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинэто же непонятная хрень!)) Как в этом разобраться?как ни странно - достаточно просто.
тем более что есть шикарный инструмент для пробы и обучения https://regex101.com
там расписаны все операторы с хорошими примерами.
ну и используется это не только в java, но и в других языках

ОзверинСтримы уже придумали, можноони такие медленные....
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39743998
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяОзверинэто же непонятная хрень!)) Как в этом разобраться?как ни странно - достаточно просто.
тем более что есть шикарный инструмент для пробы и обучения https://regex101.com
там расписаны все операторы с хорошими примерами.
ну и используется это не только в java, но и в других языках

ОзверинСтримы уже придумали, можноони такие медленные....

чтобы разобраться с кодом перейти в другой инструмент?
медленные стримы по сравнению с регекспом? Да я вас умоляю.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744005
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваш пример выводит 0 и 1, нужно, чтобы не выводилвадяОзверинMolasar, я извиняюсь, что не помогу вас, но у меня есть универсальный ответ на все подобные вопросы - не использовать рег выражения.ну зачем так категорично?

https://regex101.com/r/uwH1WY/2

https://regex101.com/r/uwH1WY/2/codegen?language=java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(?(?=\\s[1|0]\\s)\\s[0|1]\\s|(\\d+[,|.]\\d+|\\d+))";
final String string = " 1778.89 0 45 987,45 1 5 6 1 ";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744039
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasarваш пример выводит 0 и 1, нужно, чтобы не выводил
Ну так переделай сам.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744143
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Molasar, это делается циклом в разы быстрее чем регуляркой. Имею в виду не время работы приложения, а время потраченное на разработку.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744166
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopИмею в виду не время работы приложения, а время потраченное на разработку.по этому поводу есть анекдот про молодого и старого быков, которые стояли на горке и смотрели на стадо....
когда-то и ты быстро ползал, но тебя заставили ходить и ты счас можешь быстро ходить...
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744167
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,
Тут еще "студент" наверно и постановку переврал, тут не нужно matcherNum.group(), тут просто нужен replaceAll.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744176
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаТут еще "студент" наверно и постановку переврал, тут не нужно matcherNum.group(), тут просто нужен replaceAll.ну как вариант... + split

а для практики

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
         String regex = "(?=\\s[10]\\s|[01]\\s|[01])\\s|(?<xxx>\\s\\d+[,.]\\d+|\\s\\d+)";
         String string = " 1778.89 0 45 987,45 1 5 6 1  0 1 0 32 1 ";

         Pattern pattern = Pattern.compile(regex);
         Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            
                System.out.println("Group " + matcher.group("xxx"));
           
        }


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Group  1778.89
Group null
Group  45
Group  987,45
Group null
Group  5
Group  6
Group null
Group null
Group null
Group null
Group  32
Group null
только null выкинуть
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744202
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадятолько null выкинуть
и в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744216
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopMolasar, это делается циклом в разы быстрее чем регуляркой. Имею в виду не время работы приложения, а время потраченное на разработку.

так и время отработки будет быстрей, как это не странно.

Что нить вроде:

Код: java
1.
List<String> result = Arrays.stream(dst.split(" ").filter(e->!(e.trim().length()==0 || e.equals("1") || e.equals("0"))).collect(Collectors.toList());



Решение хоть и в лоб, на пишется за полторы секунды, при изменении логики не надо лезть во вторичные инструменты и отрабатывает за меньшее время. Чего еще надо?
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744238
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevвадятолько null выкинуть
и в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"
Для отсечения есть replace в котором тоже есть регэксп
" 1778.89 0 45 987,45 1 ".replaceAll("\\s[1|0]\\s", " ");
Хотя формально остается вопросссс - что делать с " 1.0 001" и тд.
ps Лёня, как тебе ник -
?
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744242
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevи в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"к сожалению я не суперспец в регулярных выражениях, может быть поэтому я не могу избавиться от null правильно, если кто подскажет - будет великолепно.
e.equals довольно медленная операция.... + stream также не быстро...
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744264
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяLeonid Kudryavtsevи в чем крутость регэкспа, если все равно потом что-то выкидывать надо?
какая разница, выкидывать в коде null или "0" и "1"к сожалению я не суперспец в регулярных выражениях, может быть поэтому я не могу избавиться от null правильно, если кто подскажет - будет великолепно.
e.equals довольно медленная операция.... + stream также не быстро...

не думаю, что вы заметите разницу в этом случае по скорости работы, а вот поддерживать гораздо проще нечто, лаконично написанное и человеческим языком. regexp - нечеловеческий.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744330
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинне думаю, что вы заметите разницу в этом случае по скорости работы, а вот поддерживать гораздо проще нечто, лаконично написанное и человеческим языком. regexp - нечеловеческий.
если ориентироваться на тех кто не сможет разобраться - нафиг тогда что- то делать.
а вот насчёт этой незаметной разницы уже наслышан...
но как придёшь куда-нибудь и из-за этой незаметной разницы сидишь и ждёшь, ждёшь....
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744333
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не верю, что регэксп будет быстрее split + цикла с if
мне кажется - как раз наоборот, регэксп может оказаться старее
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744338
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяОзверинне думаю, что вы заметите разницу в этом случае по скорости работы, а вот поддерживать гораздо проще нечто, лаконично написанное и человеческим языком. regexp - нечеловеческий.
если ориентироваться на тех кто не сможет разобраться - нафиг тогда что- то делать.
а вот насчёт этой незаметной разницы уже наслышан...
но как придёшь куда-нибудь и из-за этой незаметной разницы сидишь и ждёшь, ждёшь....

зачем гадать на кольцах ? Берешь, пишешь тесты - убеждаешься в том, что был неправ ))))
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744449
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне это нравится
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        String j = " 1778.89 0 45 987,45 1 5 6 1 0 1 0 0 0 1 1 32 1 88.99 0 ";
        long s = System.nanoTime();
        String[] d = j.replaceAll("(?=\\s[10]\\s|[01]\\s|[01])\\s", "*").replaceAll("\\*[0|1]","").trim().split(" ");
        long ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        for (String h : d) {
            System.out.println("--" + h);
        }



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
>4640716
--1778.89
--45
--987,45
--5
--6
--32
--88.99
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744452
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинЧто нить вроде:

Код: java
1.
List<String> result = Arrays.stream(dst.split(" ").filter(e->!(e.trim().length()==0 || e.equals("1") || e.equals("0"))).collect(Collectors.toList());


ты б делал не вроде а рабочий вариант, что б не гадать а сравнить
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744466
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
package test_jvm;

public class Test12 {

	public static void main(String[] args) {
		int pass;
//		for ( pass=0; pass<5; pass++ ) {
//			System.out.println( "pass="+pass );
	
        String j = " 1778.89 0 45 987,45 1 5 6 1 0 1 0 0 0 1 1 32 1 88.99 0 ";
        long s = System.nanoTime();
        String[] d = j.replaceAll("(?=\\s[10]\\s|[01]\\s|[01])\\s", "*").replaceAll("\\*[0|1]","").trim().split(" ");
        for (String h : d) {
            System.out.println("--" + h);
        }
        long ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        System.out.println("");
        
        s = System.nanoTime();
        d = j.split(" ");
        for (String h : d) {
            if (h.length()==0 || h.contentEquals("0") || h.contentEquals("1") ) {
            	;
            } else {
            	System.out.println("--" + h);
            }
        }
        ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        System.out.println("");
        //		}
	}

}



--1778.89
--45
--987,45
--5
--6
--32
--88.99
>1929314

--1778.89
--45
--987,45
--5
--6
--32
--88.99
>122591


"мне это нравится" ==> 1 929 314
split + if ==> 122 591
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744490
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

только результаты разные - у меня массив готов к использованию, у тебя только вывод после "фильтра"
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744494
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяОзверинЧто нить вроде:

Код: java
1.
List<String> result = Arrays.stream(dst.split(" ").filter(e->!(e.trim().length()==0 || e.equals("1") || e.equals("0"))).collect(Collectors.toList());


ты б делал не вроде а рабочий вариант, что б не гадать а сравнить

это рабочий вариант.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744511
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадямне это нравится
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        String j = " 1778.89 0 45 987,45 1 5 6 1 0 1 0 0 0 1 1 32 1 88.99 0 ";
        long s = System.nanoTime();
        String[] d = j.replaceAll("(?=\\s[10]\\s|[01]\\s|[01])\\s", "*").replaceAll("\\*[0|1]","").trim().split(" ");
        long ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        for (String h : d) {
            System.out.println("--" + h);
        }



Ну ладно я - я раз в 5 лет это использую (пришлось в доку лезть, хотя зарекся изучать то что не использую), ну ты-то, вижу, любишь это дело, нужно проще и прямее -
Код: java
1.
j.replaceAll("\\s[10](?=\\s)", "");
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744513
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяLeonid Kudryavtsev,
только результаты разные - у меня массив готов к использованию, у тебя только вывод после "фильтра"

Результат соответсвует ИЗ

выводились все числа, кроме 0 и 1?


Можно и в массив сложить, все равно быстрее будет. Только влом. Не интересно
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744528
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаНу ладно я - я раз в 5 лет это использую (пришлось в доку лезть, хотя зарекся изучать то что не использую), ну ты-то, вижу, любишь это дело, нужно проще и прямее -
Код: java
1.
j.replaceAll("\\s[10](?=\\s)", "");

спасибо
Код: java
1.
j.replaceAll("\\s[10](?=\\s)", "").trim().split(" ");


я это для изучения занялся...

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        String j = " 1778.89 0 45 987,45 1 5 6 1 0 1 0 0 0 1 1 32 1 88.99 0 ";
        for (int i = 0; i < 10; i++) {
            long s = System.nanoTime();
            String[] d = j.replaceAll("\\s[10](?=\\s)", "").trim().split(" ");
            long ee = System.nanoTime();
            System.out.println(">" + (ee - s));
        }

        System.out.println();
        for (int i = 0; i < 10; i++) {
            long s = System.nanoTime();
            List<String> result = Arrays.stream(j.split(" ")).filter(e -> !(e.trim().length() == 0 || e.equals("1") || e.equals("0"))).collect(Collectors.toList());
            long ee = System.nanoTime();
            System.out.println("->" + (ee - s));
        }


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
>2731305
>83729
>70256
>64802
>60632
>60632
>71539
>64160
>57424
>70576

->2077191
->79238
->39458
->27589
->24702
->26306
->31438
->29513
->25344
->27268
признаю....
stream тут быстрее
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744530
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяпризнаю....
stream тут быстрее
Такие штуки не для скорости используют, а для удобства и гибкости.
Например верификация поля в Spring ( дата действия кредитки)
Код: java
1.
2.
3.
@Pattern(regexp="^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$",
           message="Must be formatted MM/YY")
  private String ccExpiration;


Будете тут специальный код писать? Никуда не денешься, будешь изучать.
аналогично и всякие обработчики данных в XML, генераторы текстов-данных через XSLT - скорость там упадет, на больших объемах затошнит.

PS если в конце строки будет 0 или 1 без концевого пробела, то
Код: java
1.
j.replaceAll("(?<=\\s)([10]\\s|[10]$)", ""); 
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744531
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинка, в яве есть человеческие валидаторы, чтобы не пользоваться этим чудовищем. Сам валидатор так и выглядит "MM/YY"
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744533
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаБудете тут специальный код писать? Никуда не денешься, будешь изучать.кто ж с этим спорит.

ПылинкаТакие штуки не для скорости используют, а для удобства и гибкости.ну в конкретном примере ТС - можно и сравнить.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744540
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадятолько результаты разные - у меня массив готов к использованию
если без вывода, все еще печальнее

1 743 323 vs 19 230

почти 2 порядка разница

p.s. Как-то на стримах у Вас все печально. Они конечно медленные, но не настолько же.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
public class Test12 {

	public static void main(String[] args) {
		int pass;
//		for ( pass=0; pass<5; pass++ ) {
//			System.out.println( "pass="+pass );
	
        String j = " 1778.89 0 45 987,45 1 5 6 1 0 1 0 0 0 1 1 32 1 88.99 0 ";
        long s = System.nanoTime();
        String[] d = j.replaceAll("(?=\\s[10]\\s|[01]\\s|[01])\\s", "*").replaceAll("\\*[0|1]","").trim().split(" ");
        long ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        for (String h : d) {
            System.out.println("--" + h);
        }
        ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        System.out.println("");
        
        s = System.nanoTime();
        d = j.split(" ");
        for (String h : d) {
            if (h.length()==0 || h.contentEquals("0") || h.contentEquals("1") ) {
            	;
            } else {
            	System.out.println("--" + h);
            }
        }
        ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        System.out.println("");
//
        // ---
        s = System.nanoTime();
        d = j.split(" ");
        boolean flags[] = new boolean[d.length];
        int k = 0;
        for ( int i = 0; i<d.length; i++ )
        {
            String h = d[i];
            if (h.length()==0 || h.contentEquals("0") || h.contentEquals("1") ) {
            	flags[i] = false; 
            } else {
            	flags[i] = true;
            	k++;
            }
        }
        String d2[] = new String[ k ];
        k = 0;
        for ( int i = 0; i<d.length; i++ )
        {
        	if ( flags[i] ) {
        		d2[ k ] = d[ i ];
        		k++;
        	}
        }
        d = d2;
        // ---
        ee = System.nanoTime();
        System.out.println(">" + (ee - s));
        for (String h : d) {
            System.out.println("--" + h);
        }
        
        //		}
	}

}



[src]
>1743323
--1778.89
--45
--987,45
--5
--6
--32
--88.99
>1992111

--1778.89
--45
--987,45
--5
--6
--32
--88.99
>163756

>19230
--1778.89
--45
--987,45
--5
--6
--32
--88.99
[src]
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744546
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот они, не правильные тесты, без прогонов )))

у меня на пятом прогоне

18 629 - split + if руками
34 554 - stream
150 835 - regexp
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744548
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

да, стоит пожертвовать "читабельностью"
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744550
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый быстрый код - самый простой. Чем стримы читабельнее - я х.з.
Код: java
1.
2.
3.
4.
5.
6.
        ArrayList<String> arr = new ArrayList<String>();
        for ( String h : d ) {
        	if ( !( h.length() == 0 || h.equals("1") || h.equals("0") ) ) {
        		arr.add( h );
        	}
        }
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744552
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev 18 629 - split + if руками
34 554 - stream
150 835 - regexp
Лёня, это в дюймах или в сантиметрах?
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744554
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСамый быстрый код - самый простой. Чем стримы читабельнее - я х.з.
Код: java
1.
2.
3.
4.
5.
6.
        ArrayList<String> arr = new ArrayList<String>();
        for ( String h : d ) {
        	if ( !( h.length() == 0 || h.equals("1") || h.equals("0") ) ) {
        		arr.add( h );
        	}
        }

ну хорошо , что сделал, а то я уж испугался, что вдруг без листа...
ПылинкаЛёня, это в дюймах или в сантиметрах?в чём-то его компа...
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744556
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСамый быстрый код - самый простой. Чем стримы читабельнее - я х.з.

Да ведь даже официально где-то видел признание от авторов стримов, что "они "пока что медленнее", я думал что все это знают.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744558
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЧем стримы читабельнее - я х.з.возможно вкусовщина, но мне стримы тоже кажутся читабельней - лучше видно что хотели сделать

Код: java
1.
2.
3.
List<String> result = Arrays.stream(j.split("\\s+"))
                                       .filter(i -> !blacklist.contains(i))
                                       .collect()


если подобный код не выполняется 10000 раз в цикле, то пофиг, что медленней.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744560
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaесли подобный код не выполняется 10000 раз в цикле, то пофиг, что медленней.тут фишка в том, что таких "кусочков" кода может набраться довольно много и в результате тормозная система...
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744565
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяи в результате тормозная система...
тормозить она будет скорее всего не из-за этого. кроме того можно тоже самое сказать про любое высокоуровневое решение на яве или даже про всю яву скопом - зачем ee юзать если производительность во главе угла
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744568
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaтормозить она будет скорее всего не из-за этого. кроме того можно тоже самое сказать про любое высокоуровневое решение на яве или даже про всю яву скопом - зачем ee юзать если производительность во главе углавыбор java или не ява не обсуждается.
но вот если есть выбор 2+ вариантов кода - то выбор более быстрого предпочтителен.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744569
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяно вот если есть выбор 2+ вариантов кода - то выбор более быстрого предпочтителен
почему? один из основных критериев, который привел нас к яве, все еще тот же - пусть будет не самое самое быстрое, но зато легко писать, легко читать и легко модифицировать. Кто-то может сходу сказать, что делает эта вполне реальная регулярка?
Код: java
1.
private static final Pattern p = Pattern.compile("^(?=.*[A-Z].*)(?=.*[!@#\\-\\$\\&\\*\\?\\^\\)\\(\\+\\=\\.\\_\\<\\>])(?=.*[0-9].*)(?=.*[a-z].*).*$");


такой себе write-only код. что-то типа черного ящика, руками не трогать, ничего не менять ;)
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744575
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
позвольте не согласиться, пишется один раз, а поминают не добрым словом постоянно.
читать можно всё, если по умному написано, даже очень сложное. и модифицировать тоже. это не проблема.
проблема в этой регулярке только то, что редко пользуются, и поэтому всё в памяти не держится....
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744586
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяпозвольте не согласиться
эт сколько угодно ;)

вадяпишется один раз
кто как. ни один из клиентов, с которыми я имел дело, не мог сформулировать задачу так, чтобы потом не пришлось доделывать, переделывать и расширять. могу только позавидовать тем, кто пишет один раз

вадячитать можно всё
можно, только на понимание прочитанного будет уходить разное время. Плюс еще можно понять неправильно. Мой любимый пример из повседневной практики копания в навозе
Код: java
1.
2.
if (Bool.isTrue(user.isAccountExpired()) == false) {
}


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

вадяпроблема в этой регулярке только то, что редко пользуются, и поэтому всё в памяти не держитсяона слишком за пределами тривиального, хотя бы в силу размера. даже если знаешь каждый из элементов, ее придется разобрать на части, чтобы осознать, что там делается. по-этому в случае если 100% уверен, что выражение правильное и никогда не будет изменено - можно юзать. Если же нет, неплохо бы написать и попонятней. имхо.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744723
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaКто-то может сходу сказать, что делает эта вполне реальная регулярка?
Код: java
1.
private static final Pattern p = Pattern.compile("^(?=.*[A-Z].*)(?=.*[!@#\\-\\$\\&\\*\\?\\^\\)\\(\\+\\=\\.\\_\\<\\>])(?=.*[0-9].*)(?=.*[a-z].*).*$");


такой себе write-only код. что-то типа черного ящика, руками не трогать, ничего не менять ;)
Вы затронули как раз один из больных вопросов. Некоторые выдающиеся разработчики считают что "код - лучшая документация", в чем я с ними коренным образом не соглашался.
В данном случае разработчик обязан описать что данный фрагмент должен делать. Тем более что это не точный алгоритм, а всего лишь шаблон и с неограниченным вхождением любых символов.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39744728
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаНекоторые выдающиеся разработчики считают что "код - лучшая документация", в чем я с ними коренным образом не соглашался
Я я согласен. Если намерение можно выразить кодом, то лучше так и сделать. В данном случае я намеренно подправил пример. В оригинале он выглядит как
private static final Pattern SECURE_PASSWORD_PATTERN = ...
так уже гораздо понятней, о чем речь, не так ли?
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39745033
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Код: java
1.
2.
3.
4.
5.
6.
ArrayList<String> arr = new ArrayList<String>();
        for ( String h : d ) {
        	if ( !( h.length() == 0 || h.equals("1") || h.equals("0") ) ) {
        		arr.add( h );
        	}
        }


Тем что стримы четко отделяют "намерение" от "имплементации". Алгоритм перебора это лико тривиальная штука, которая повторяется 100500 раз в каждом проекте, не ну если нравится то ок, но если можно закодировать раз и навсегда и использовать функции высшего порядка для кастомизации - то так и надо делать, тут даже вопрос не в читаьельности, банальное переиспользование кода.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39745104
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaПылинкаНекоторые выдающиеся разработчики считают что "код - лучшая документация", в чем я с ними коренным образом не соглашался
Я я согласен. Если намерение можно выразить кодом, то лучше так и сделать. В данном случае я намеренно подправил пример. В оригинале он выглядит как
private static final Pattern SECURE_PASSWORD_PATTERN = ...
так уже гораздо понятней, о чем речь, не так ли?


Наверное, все понимают, что надо бы писать документацию, но я не видел еще ни одного корпоративного проекта, где документация была б актуальнее кода.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39745146
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинНаверное, все понимают, что надо бы писать документацию, но я не видел еще ни одного корпоративного проекта, где документация была б актуальнее кода.
Я подчеркиваю - что должна делать , а не как делает ( и даже не как оно делается на самом деле ).

Вот ведь не случайно такие вопросы возникают - https://www.sql.ru/forum/1306445/uridicheskiy-vopros-pro-kontrakt .
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39745174
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаОзверинНаверное, все понимают, что надо бы писать документацию, но я не видел еще ни одного корпоративного проекта, где документация была б актуальнее кода.
Я подчеркиваю - что должна делать , а не как делает ( и даже не как оно делается на самом деле ).

Вот ведь не случайно такие вопросы возникают - https://www.sql.ru/forum/1306445/uridicheskiy-vopros-pro-kontrakt .


все-таки первична - реальность. В реальности документация всегда догоняет код, а не наоборот, а значит код должен быть самодокументируемым.
...
Рейтинг: 0 / 0
Выбрать из строки все числа, кроме 0 и 1
    #39745365
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинНаверное, все понимают, что надо бы писать документацию
наверное смотря где и для каких вещей. Для начала неплохо бы код писать более менее само документируемый, так чтоб требовал минимум комментариев :)
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Выбрать из строки все числа, кроме 0 и 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]