- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
public class ExtractSubstrings {
public static void main(String[] args) {
String text = “To be or not to be”;
int count = 0;
char separator = ‘ ‘;
int index = 0;
do {
++count;
++index;
index = text.indexOf(separator, index);
} while (index != -1);
String[] subStr = new String[count];
index = 0;
int endIndex = 0;
for(int i = 0; i < count; ++i) {
endIndex = text.indexOf(separator,index);
if(endIndex == -1) {
subStr[i] = text.substring(index);
} else {
subStr[i] = text.substring(index, endIndex);
}
index = endIndex + 1;
}
for(String s : subStr) {
System.out.println(s);
}
}
}
Очень чёткий, простой и с первого взгляда сразу понятный способ сделатЬ сплит строки.
bormand 09.02.2013 19:52 # −12
Ну мне, как сишнику, этот код действительно с первого взгляда сразу понятный. Но в жабе я поюзал бы готовый split.
Кстати, из-за строки 10 оно всегда пропускает первый символ. И, если взять строку с пробелом в начале, в духе " shit happens", оно получит неправильный count, и разобьет эту строку на "" и "shit" просрав "happens".
bormand 10.02.2013 21:53 # −5
Dummy00001 11.02.2013 02:36 # +1
старая песня. штатный split в жабе использует регулярки и тормозит немеряно.
я еще только двумя жабными проектами запачакался - но в обоих есть доморощенный сплит по символу.
tir 11.02.2013 08:30 # 0
простите, а какого типа приложения вы пишите, что скорость работы split становится критична?
bormand 11.02.2013 08:53 # −5
tir 11.02.2013 09:12 # +1
просто вот так обычно кто-нить скажет "да сплит в жабе тормозит", "нельзя складывать строки" и т. п., кто-то краем глаза увидит и начнет писать свои сплиты и придумывать какие-то неведомые оптимизации в проекте не задумываясь о том, что у него и без сплита тормозов хватает.
ПС. У меня в проекте split по пробелу на наборе 70 000 - 75 000 строк делается за десятки миллисекунд
Dummy00001 11.02.2013 13:52 # 0
у нас в CSV лежит конфигурация. от 4 до 12 миллионов строк. разница очень сильно заметна.
(конфиг выдергивается из базы другим приложением, потому что основное приложение должно быть независимым от базы в рантайме.)
tir 11.02.2013 15:04 # +2
кому-то надо миллионы (миллиарды) строк засплитить, пробует стандартный сплит - типа медленно, после этого человек начинает на каждом углу говорить "не юзайте сплит - тормозит!" при этом не сообщая, что он гигабайты строк сплитит. кто-нибудь читает такое заявление и у него стереотип складывается "не буду юзать, а то тормозить будет!" и пишет что-нить свое.
Если вы говорите, что у вас что-то тормозит - говорите на каком объеме данных это происходит (или какова частота вызова метода).
Dummy00001 11.02.2013 13:49 # 0
bormand 11.02.2013 13:55 # −5
А можно сравнить ваш split со split'ом в Pattern (если паттерн заготовить 1 раз, перед распарсиванием файла)? Не будет ли тут большую часть времени занимать чтение с диска? (Если будете тестировать, то желательно на файле в 4+ гига, чтобы свести на нет эффект от файлового кеша).
Dummy00001 11.02.2013 14:06 # 0
ЗЫ это то что я нашел когда я собирался удалять доморощеный split:
http://stackoverflow.com/questions/5965767/performance-of-stringtokenizer-class-vs-split-method-in-java
это как раз и заставило меня приглядется и увидеть что `String.split(String)` на самом деле тоже сплитит по регулярке. и штатного сплита по букве в принципе не существует.
bormand 11.02.2013 16:00 # −16
Построчное чтение без сплитов - 28с.
String.split - 88с.
Pattern.split - 68c.
IndexOf (с сохранением частей в массив) - 39с.
В split'ах по показаниям профайлера около 35% времени уходит на java.util.regex.Matcher.find, т.е. ту самую регулярку.
P.S. Кстати, в седьмой джаве улучшили String.split, теперь он если видит один символ, то работает без регулярки (54с).
absolut 11.02.2013 14:50 # +1
>от файлового кеша
а вдруг у меня кеш на 8?
bormand 11.02.2013 15:04 # −5
Просто если взять слишком мало - первый же тест всосет все в память, и у следующих тестироваться будут не ввод\вывод, а чтение из кеша, а это уже не совсем реалистичные условия (выше Dummy00001 пишет, что там конфигурация, которую, видимо, загружают 1 раз при старте программы).
absolut 11.02.2013 16:16 # 0
bormand 11.02.2013 16:20 # −5
absolut 11.02.2013 16:26 # 0
bormand 11.02.2013 16:31 # −5
Dummy00001 11.02.2013 16:56 # 0
на линухе, man fadvise.
Мистер Хэнки 10.02.2013 19:38 # +4
wvxvw 10.02.2013 23:19 # 0
tir 11.02.2013 08:34 # +1
eth0 11.02.2013 16:03 # 0
> “
> ”
Следствие копипасты или упоротости? Допустимы ли лапки («»)?
bormand 11.02.2013 16:05 # −5
absolut 11.02.2013 16:18 # +4
3.14159265 11.02.2013 18:21 # +3
Но до сих пор так и делают.
Только вместо фото мне присылают скрины интерефейса.
scriptin 13.02.2013 20:02 # +2
Их сменили новые, которые не умеют вставлять фотографии даже в документы и все рассылают через ВКонтакт.
>Только вместо фото мне присылают скрины интерефейса.
А в качестве оплаты за консультации вставляют в документ сканы денег?
absolut 14.02.2013 07:43 # +4
Сканы сисек
barop 11.01.2017 05:09 # −14
guest 10.01.2017 00:15 # −6
guest 10.01.2017 00:20 # −13
inkanus-gray 12.01.2017 11:32 # +2
guest 21.04.2017 10:56 # −6
barop 21.04.2017 18:39 # −12