powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Разбивка на слова
42 сообщений из 42, показаны все 2 страниц
Разбивка на слова
    #39654473
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть текст:
Код: java
1.
String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";



Как мне разбить текст на слова по "," чтобы получился массив с:
Код: java
1.
2.
3.
"Сумма, руб.",
"Сумма (без НДС), руб",
"Кол-во"



???

Я так понимаю нужна регулярка.

Обязательно подниму стакан за того кто поможет =)
Спасибо!
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654483
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

split
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654488
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, нда... )
Немного другое я ожидал услышать
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654489
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю что чрез text.split().
Но я делю предложение по фразам заключенным в кавычки, через запятую (т.е. разделитель запятая).
Но запятая также может содержаться и в самой фразе, а мне не нужно это учитывать.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654507
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда split по
Код: plaintext
\", \"
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654509
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - устойчивое дежа-вю 21076195
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654518
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще на json похоже. Точнее на его кусок.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это обычный comma-separated-values. +Текстовые литералы заключены в quotes.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654713
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

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

public class Split {
    private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\", \"");
    public static void main(String args[]) {
        String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        List<String> splitedString = QUOTE_WITH_COMMA.splitAsStream(text.replaceFirst("^\"", "").replaceFirst("\"$", ""))
            .collect(Collectors.toList());
        System.out.println("Splitted string = " + splitedString);
        // Splitted string = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
    }
}



С уважением, Валентин
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654819
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше через json mapper

на выходе получите: String[]

Код: java
1.
2.
ObjectMapper mapper = new ObjectMapper();
String[] strings = mapper.readValue("[" + "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"" + "]", String[].class);
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654913
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если эта строка в тексте кода, то на кой ляд стока городить?

String text = "\"Сумма, руб.\"@ \"Сумма (без НДС), руб\"@ \"Кол-во\"";
и сплитом по @.
а так - странно использовать в качестве разделителя тот же символ, что и встречается в тексте.

2Герой дня
оно конечно 2 строки вроде красиво, но это объект, но во что разворачивается его выполнение?
...
Рейтинг: 0 / 0
Разбивка на слова
    #39654934
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще с помощью ANTLR.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655298
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесли эта строка в тексте кода, то на кой ляд стока городить?

String text = "\"Сумма, руб.\"@ \"Сумма (без НДС), руб\"@ \"Кол-во\"";
и сплитом по @.
а так - странно использовать в качестве разделителя тот же символ, что и встречается в тексте.

2Герой дня
оно конечно 2 строки вроде красиво, но это объект, но во что разворачивается его выполнение?

в миллисекунду или меньше
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655311
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дня,
тогда сплит будет измерчться в микросекундах
оно, конешно, само по себе не критично, но когда таких кусков море - уже требуется рефакторить...
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655346
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
Ну да, бывает такое, что код необходимо допиливать...
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655350
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяесли эта строка в тексте кода, то на кой ляд стока городить?

String text = "\"Сумма, руб.\"@ \"Сумма (без НДС), руб\"@ \"Кол-во\"";
и сплитом по @.
а так - странно использовать в качестве разделителя тот же символ, что и встречается в тексте.

2Герой дня
оно конечно 2 строки вроде красиво, но это объект, но во что разворачивается его выполнение?

Это не строка в тексте, точнее это инструмент который должен принимать код в стандарте SQL92 и понятен всем. Если там будут всякие мифические символы типа @ это ИМХО говно.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655353
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HettВообще на json похоже. Точнее на его кусок.
Неа, это не JSON, простой SQL с комментами в которых заключаются настройки для вывода результата
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655355
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valentin KolesnikovAndronovMV,

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

public class Split {
    private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\", \"");
    public static void main(String args[]) {
        String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        List<String> splitedString = QUOTE_WITH_COMMA.splitAsStream(text.replaceFirst("^\"", "").replaceFirst("\"$", ""))
            .collect(Collectors.toList());
        System.out.println("Splitted string = " + splitedString);
        // Splitted string = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
    }
}



С уважением, Валентин

Спасибо! )
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655551
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ради хохмы
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class Xxx4 {

    private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\", \"");

    public static void main(String args[]) {
        long s = System.nanoTime();
        String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        List<String> splitedString = QUOTE_WITH_COMMA.splitAsStream(text.replaceFirst("^\"", "").replaceFirst("\"$", ""))
                .collect(Collectors.toList());
       System.out.println(System.nanoTime() - s);
       System.out.println("Splitted string = " + splitedString);
        
    }

}


время выполнения 141 101 443

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Xxx5 {

    private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\", \"");

    public static void main(String args[]) {
        long s = System.nanoTime();
        String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        String[] splitedString = text.replace("\", ", "\"@").split("@");
        System.out.println(System.nanoTime() - s);
        System.out.println("Splitted string = " + splitedString[0] + "   " + splitedString[2] + "   " + splitedString[2]);
        
    }

}


время выполнения 1 904 517

каждый волен выбирать своё
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655638
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Так не меряют. Нужен JMH.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655646
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... и разбор косяков микротестов.
Задлянафига, если профилирование ещё не сказало своего веского слова?
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655663
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь нечего профилировать. Я так думаю.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655667
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТак не меряют. Нужен JMH.
понятно, что надо прогнать множество, циклов и пр.пр.
но это когда очень близкие цифры.
но тут разница приличная, и она заключается просто в количестве выполненного кода.
и я не уверен, что оптимизатор примет участие, ведь такой код в рантайме не будет использоваться очень многократно.
но если есть желание - я с удовольствием посмотрю на более качественные тесты сравнения.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655786
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
import java.util.ArrayList;
import java.util.List;

public class Split {
    public static void main(String args[]) {
        long s = System.nanoTime();
        String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        List<String> result = new ArrayList<>();
        int savedIndex = 1;
        for (int index = 0; index < text.length() - 4; index += 1) {
            if (text.substring(index, index + 4).equals("\", \"")) {
                result.add(text.substring(savedIndex, index));
                savedIndex = index + 4;
                index += 4;
            }
        }
        result.add(text.substring(savedIndex, text.length() - 1));
        System.out.println(System.nanoTime() - s);
        System.out.println("Split string = " + result);
    }
}



Вариант с циклом.

С уважением, Валентин
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655795
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov, substring.... жесть какая
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655857
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public class Split {


    public static void main(String args[]) {
        long s = System.nanoTime();
        String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        List<String> result = new ArrayList<>();
        int savedIndex = 1;
        int f = text.length() - 4;
        for (int index = 0; index < f; ++index) {
            if (text.substring(index, index + 4).equals("\", \"")) {
                result.add(text.substring(savedIndex, index));
                index += 4;
                savedIndex = index;
            }
        }
        result.add(text.substring(savedIndex, text.length() - 1));
        System.out.println(System.nanoTime() - s);
        System.out.println("Split string = " + result);
    }

}


Leonid KudryavtsevValentin Kolesnikov, substring.... жесть какаяоно того стоит
время выполнения 106 567
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. Родные. Драгоценные. Осадите коней. Вы сейчас один за другим продуцируете
фейерический поток сознания и еще дальше уводите в дебри бедного Андронова.

Для того чтобы доказать что в Java один метод (практически а не алгоритмически) быстрее другого
вы должны.

- подготовить среду тестирования. Как минимум сделать warm-up. Миллион способов как это сделать. Но только
не 1 раз вызвать метод main().
- подготовить репрезентативный набор 1000 - 10000 и более строк. И разных. И тех
которые будут похожи на настоящие. И учесть wors-cases (в одном поле - целая другая строка CSV)

Да и не смотрите в профилировщик. Стандартный вам не поможет. Он просто не покажет
вам rootcause вашего тормоза.

А еще лучше сделать шаг назад и подумать а зачем делать разбивку строки? Может надо делать
сразу целый файл? Stream?
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655908
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
я могу только повторить что уже сказал, что оптимизатор может и не подключиться в рантайме.
да такой метод сравнения очень относительный
но я запускал не один раз и видел что время скачет, я выбрал примерно часто встречающееся
разница в 100, и 10 раз позволяет с большой вероятностью судить о скорости.
я не думаю что настоящие тесты покажут обратное соотношение.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655921
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы как нибудь так сделал. По скорости (на 10 повторах), примерно одинаково вариантом на substr'ах. Но по логике, потреблять памяти должно меньше.


От copy-past форматирование (отступы) немного уехали (((.
Код: 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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
package test_jvm;

import java.text.ParseException;
import java.util.*;

class Parser {
	public final static int M_INIT = 0;
	public final static int M_WAIT_QUOTE = 1;
	public final static int M_INSIDE_STRING = 2;
	public final static int M_WAIT_COMMA = 3;

	ArrayList<String> result;
    	
    char src[];
    int beginPos, endPos;
    int mode;
    
    Parser(  ) {
      mode = M_INIT;
    }
    
    private void processToken() {
    	String s = new String( src, beginPos, endPos-beginPos );
    	result.add( s );
    }
    
    public List<String> parse( String s) throws ParseException {
    	int len;
    	result = new ArrayList<String>();
    	src = s.toCharArray();
    	
    	len = src.length;
    	this.mode = M_WAIT_QUOTE;
    	for (int pos=0; pos<len; pos++ ) {
    		char c = src[ pos ];
    		
    		switch ( mode ) {
    		case M_WAIT_QUOTE:
    			switch (c) {
    			case ' ':
    				break; 
    			case '\"':
    				// String begin
    				this.beginPos = pos+1;
    				mode = M_INSIDE_STRING;
    				break;
    			default:
    				throw new ParseException( "Syntax error. Expected quote char.", pos );
    			}
    			break;
    		case M_INSIDE_STRING:
    			switch (c ) {
    			case '\"':
    				// String end
    				this.endPos = pos;
    				processToken();
    				this.mode = M_WAIT_COMMA;
    				break;
    			default:
    				break;
    			}
    			break;
		case M_WAIT_COMMA:
			switch ( c ) {
			case ' ':
				break;
			case ',':
				this.mode = M_WAIT_QUOTE;
				break;
			default:
				throw new ParseException( "Syntax error. Expected comma char.", pos );
			}
			break;
    		} 	// case
    	}	// for
    	// End of source string. Correct mode is only M_WAIT_COMMA
    	switch ( mode ) {
    	case M_WAIT_QUOTE:
		throw new ParseException( "Syntax error. Notting after last comma", len );
    	case M_INSIDE_STRING:
		throw new ParseException( "Syntax error. String not closed correctly.", len );
    	case M_WAIT_COMMA:
    		// OK
    		break;
    	}
    	return result;
    }
}

public class TestParser {

	public static void vadja( String text ) {
        long s = System.nanoTime();
        List<String> result = new ArrayList<>();
        int savedIndex = 1;
        int f = text.length() - 4;
        for (int index = 0; index < f; ++index) {
            if (text.substring(index, index + 4).equals("\", \"")) {
                result.add(text.substring(savedIndex, index));
                index += 4;
                savedIndex = index;
            }
        }
        result.add(text.substring(savedIndex, text.length() - 1));
        System.out.println( "time vadj="+(System.nanoTime() - s) );
        System.out.println("Split string (Vadja) = " + result);
	}
	
	public static void tigralen( Parser p, String text ) throws ParseException {
        long s = System.nanoTime();

        List<String> result = p.parse( text );
        System.out.println("time tigralen="+(System.nanoTime() - s) );
        System.out.println("Split string (tigralen) = " + result);
	}
	

    public static void main(String args[]) throws ParseException {
        String text;
        Parser p = new Parser();
        
        for ( int pass=0; pass<10; pass++ ) {
        	System.out.println( "***************" );
        	
        	text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
        	vadja( text );
        	tigralen( p, text );
    		// ------------------
        	text = text + ", " + text + ", " + text + ", " + text;
        	vadja( text );
        	tigralen( p, text );
        	// ------------------
        }
    }
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
time vadj=10517
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=4808
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time vadj=21033
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=13821
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]
***************
time vadj=6911
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=8413
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во]
time vadj=16826
Split string (Vadja) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]
time tigralen=11418
Split string (tigralen) = [Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во, Сумма, руб., Сумма (без НДС), руб, Кол-во]


...
Рейтинг: 0 / 0
Разбивка на слова
    #39655950
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяно тут разница приличная"Меня опять терзают смутные сомнения", что "приличную разницу" даёт компиляция регулярного выражения ...
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655952
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov"Меня опять терзают смутные сомнения", что "приличную разницу" даёт компиляция регулярного выражения ...
вроде она вынесена за интервал измерения
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655961
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявроде она вынесена за интервал измеренияДело даже не в этом ...
Test.java
Код: 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.
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;

public class Test
{
  private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\", \"");

  public static void main(String args[])
  {
    String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
    System.out.println("Source: " + text);

    List<String> result;
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());

    long s = System.nanoTime();
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    System.out.println((System.nanoTime() - s) + ": by replace = " + result);

    s = System.nanoTime();
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());
    System.out.println((System.nanoTime() - s) + ": by regex = " + result);
  }
}

Код: plaintext
1.
2.
Source: "Сумма, руб.", "Сумма (без НДС), руб", "Кол-во"
67069: by replace = ["Сумма, руб.", "Сумма (без НДС), руб", "Кол-во"]
172233: by regex = [Сумма, руб., Сумма (без НДС), руб, Кол-во]

Разница, примерно, трёхкратная, а совсем не два порядка.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655991
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и для сравнения:
Test.java
Код: 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.
import java.util.*;
import java.util.regex.*;
import java.util.stream.*;

public class Test
{
  private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\",\\s*\"");

  public static void main(String args[])
  {
    String text = "\"Сумма,руб.\",  \"Сумма (без НДС),руб\", \t\"Кол-во\"";
    System.out.println("Source: " + text);

    List<String> result;
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());

    long s = System.nanoTime();
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    System.out.println((System.nanoTime() - s) + ": by replace = " + result);

    s = System.nanoTime();
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());
    System.out.println((System.nanoTime() - s) + ": by regex = " + result);
  }
}

Код: plaintext
1.
2.
Source: "Сумма,руб.",  "Сумма (без НДС),руб",   "Кол-во"
63045: by replace = ["Сумма,руб.",  "Сумма (без НДС),руб",      "Кол-во"]
150235: by regex = [Сумма,руб., Сумма (без НДС),руб, Кол-во]
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655992
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
скорее всего разница не только в этом . я формирую массив, а ты лист.
для правомерности сравнения надо сдела приведение и так и так.
первоначально я стремился ускорить не только сплитом.
заменю массив на лист для чистоты.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39655999
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, дык, чтобы было сравнимо, я и собрал массив в список.
подальше положишь - поближе возьмёшь
Код: 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.
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Test
{
  private static final Pattern QUOTE_WITH_COMMA = Pattern.compile("\",\\s*\"?");

  public static void main(String args[])
  {
    String text = "\"Сумма,руб.\",\"Сумма (без НДС),руб\",\t \"Кол-во\",";
    System.out.println("Source: " + text);

    List<String> result;
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());

    long s = System.nanoTime();
    result = Arrays.asList( text.replace("\", ", "\"@").split("@") );
    System.out.println((System.nanoTime() - s) + ": by replace = " + result + "(" + result.size() + ")");

    s = System.nanoTime();
    result = QUOTE_WITH_COMMA
      .splitAsStream(text.replaceFirst("^\"", "")
      .replaceFirst("\"$", ""))
      .collect(Collectors.toList());
    System.out.println((System.nanoTime() - s) + ": by regex = " + result + "(" + result.size() + ")");
  }
}

Код: plaintext
1.
2.
Source: "Сумма,руб.","Сумма (без НДС),руб",      "Кол-во",
33535: by replace = ["Сумма,руб.","Сумма (без НДС),руб",         "Кол-во",](1)
166063: by regex = [Сумма,руб., Сумма (без НДС),руб, Кол-во](3)
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656002
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще: нужен велосипед - загляни в Apache Commons CSV
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656007
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа такого. Только у меня вертикальная палочка - делиметер. А в топике - будет запятая.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        String src = "/sqlite/northwind-SQLite3/OrderDetails.csv";

        CSVParser parser = CSVParser.parse(new FileReader(src),
                CSVFormat.newFormat('|')
                        .withSkipHeaderRecord()
                        .withFirstRecordAsHeader());

        Iterator<CSVRecord> iterator = parser.iterator();

        int cnt = 0;

        while (iterator.hasNext()) {
            CSVRecord rec = iterator.next();

            logger.info("Detected record = {}",rec.toMap());
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656014
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
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.
public class Split {

        public static void main(String args[]) {
            long total = 0;
            for(int j = 0; j < 500000; j++) {
                long s = System.nanoTime();
                String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\" o\", \"";
                List<String> result = new ArrayList<>();

                // x3:
                int beg = 0;
                char prev = 0;
                char prevprev = 0;
                int i = 0;
                while(true) {
                    if(i == text.length()) {
                        if(++beg != text.length()) {
                            result.add(text.substring(beg, text.length()));
                        }
                        break;
                    }
                    char curr = text.charAt(i);
                    if(curr == '\"'
                            && prev == ' '
                            && prevprev == ',') {
                        result.add(text.substring(beg, i - 2));
                        beg = i;
                    }
                    prevprev = prev;
                    prev = curr;
                    i++;
                }

                total += System.nanoTime() - s;
                result.clear();
            }
            System.out.println("x3: " + total/500000);

            total = 0;
            for(int j = 0; j < 500000; j++) {
                long s = System.nanoTime();
                String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\" o\", \"";
                List<String> result = new ArrayList<>();

                //SUBSTRING:
                int savedIndex = 1;
                int f = text.length() - 4;
                for (int index = 0; index < f; ++index) {
                    if (text.substring(index, index + 4).equals("\", \"")) {
                        result.add(text.substring(savedIndex, index));
                        index += 4;
                        savedIndex = index;
                    }
                }
                result.add(text.substring(savedIndex, text.length() - 1));
                total += System.nanoTime() - s;
                result.clear();
            }
            System.out.println("SUBSTRING: " + total/500000);
        }
}


авторx3: 360
SUBSTRING: 955
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656065
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
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.
public class Split {

    public static void main(String args[]) {
        long total = 0;

        for (int j = 0; j < 500000; j++) {
            long s = System.nanoTime();
            String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\" ";
            List<String> result = new ArrayList<>();

            //SUBSTRING:
            int savedIndex = 1;
            int f = text.length() - 4;
            for (int index = 0; index++ < f;) {

                if (text.charAt(index) == '\"' && text.charAt(++index) == ',' && text.charAt(++index) == ' ' && text.charAt(++index) == '\"') {
                    result.add(text.substring(savedIndex, index - 4));
                    savedIndex = index;
                }
            }
            result.add(text.substring(savedIndex, text.length() - 1));
            total += System.nanoTime() - s;
            result.clear();
        }
        System.out.println("SUBSTRING: " + total / 500000);
        total = 0;

        for (int j = 0; j < 500000; j++) {
            long s = System.nanoTime();
            String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
            List<String> result = new ArrayList<>();

            // x3:
            int beg = 0;
            char prev = 0;
            char prevprev = 0;
            int i = 0;
            int tl = text.length();
            while (true) {
                if (i == tl) {
                    if (++beg != tl) {
                        result.add(text.substring(beg, tl));
                    }
                    break;
                }
                char curr = text.charAt(i);
                if (curr == '\"'
                        && prev == ' '
                        && prevprev == ',') {
                    result.add(text.substring(beg, i - 2));
                    beg = i;
                }
                prevprev = prev;
                prev = curr;
                i++;
            }

            total += System.nanoTime() - s;
            result.clear();
        }
        System.out.println("x3: " + total / 500000);

    }
}



SUBSTRING: 524
x3: 865

equals = тормоз
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656072
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправка
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
for (int j = 0; j < 500000; j++) {
            long s = System.nanoTime();
            String text = "\"Сумма, руб.\", \"Сумма (без НДС), руб\", \"Кол-во\"";
            List<String> result = new ArrayList<>();

            //SUBSTRING:
            int savedIndex = 0;
            int f = text.length() -4;
            for (int index = 0; index < f;index++) {

                if (text.charAt(index) == '\"' && text.charAt(++index) == ',' && text.charAt(++index) == ' ' && text.charAt(++index) == '\"') {
                    result.add(text.substring(savedIndex, index - 2));
                    savedIndex = index-1;
                }
            }
            result.add(text.substring(savedIndex, text.length() ));
            total += System.nanoTime() - s;
            result.clear();
        }
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656080
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторx3: 271
SUBSTRING NO EQUALS: 154

Ты выиграл) Поизаимствовав мои идеи))
Я думал доп переменные будут быстрее проверок которые есть в charAt(), ан нет.
...
Рейтинг: 0 / 0
Разбивка на слова
    #39656091
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892авторx3: 271
SUBSTRING NO EQUALS: 154

Ты выиграл) Поизаимствовав мои идеи))
Я думал доп переменные будут быстрее проверок которые есть в charAt(), ан нет.
меня смутило твоё использование substring 2 раза при уаеличении скорости.,...
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Разбивка на слова
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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