- 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);
}
}
}
Очень чёткий, простой и с первого взгляда сразу понятный способ сделатЬ сплит строки.
Ну мне, как сишнику, этот код действительно с первого взгляда сразу понятный. Но в жабе я поюзал бы готовый split.
Кстати, из-за строки 10 оно всегда пропускает первый символ. И, если взять строку с пробелом в начале, в духе " shit happens", оно получит неправильный count, и разобьет эту строку на "" и "shit" просрав "happens".
старая песня. штатный split в жабе использует регулярки и тормозит немеряно.
я еще только двумя жабными проектами запачакался - но в обоих есть доморощенный сплит по символу.
простите, а какого типа приложения вы пишите, что скорость работы split становится критична?
просто вот так обычно кто-нить скажет "да сплит в жабе тормозит", "нельзя складывать строки" и т. п., кто-то краем глаза увидит и начнет писать свои сплиты и придумывать какие-то неведомые оптимизации в проекте не задумываясь о том, что у него и без сплита тормозов хватает.
ПС. У меня в проекте split по пробелу на наборе 70 000 - 75 000 строк делается за десятки миллисекунд
у нас в CSV лежит конфигурация. от 4 до 12 миллионов строк. разница очень сильно заметна.
(конфиг выдергивается из базы другим приложением, потому что основное приложение должно быть независимым от базы в рантайме.)
кому-то надо миллионы (миллиарды) строк засплитить, пробует стандартный сплит - типа медленно, после этого человек начинает на каждом углу говорить "не юзайте сплит - тормозит!" при этом не сообщая, что он гигабайты строк сплитит. кто-нибудь читает такое заявление и у него стереотип складывается "не буду юзать, а то тормозить будет!" и пишет что-нить свое.
Если вы говорите, что у вас что-то тормозит - говорите на каком объеме данных это происходит (или какова частота вызова метода).
А можно сравнить ваш split со split'ом в Pattern (если паттерн заготовить 1 раз, перед распарсиванием файла)? Не будет ли тут большую часть времени занимать чтение с диска? (Если будете тестировать, то желательно на файле в 4+ гига, чтобы свести на нет эффект от файлового кеша).
ЗЫ это то что я нашел когда я собирался удалять доморощеный split:
http://stackoverflow.com/questions/5965767/performance-of-stringtokenizer-class-vs-split-method-in-java
это как раз и заставило меня приглядется и увидеть что `String.split(String)` на самом деле тоже сплитит по регулярке. и штатного сплита по букве в принципе не существует.
Построчное чтение без сплитов - 28с.
String.split - 88с.
Pattern.split - 68c.
IndexOf (с сохранением частей в массив) - 39с.
В split'ах по показаниям профайлера около 35% времени уходит на java.util.regex.Matcher.find, т.е. ту самую регулярку.
P.S. Кстати, в седьмой джаве улучшили String.split, теперь он если видит один символ, то работает без регулярки (54с).
>от файлового кеша
а вдруг у меня кеш на 8?
Просто если взять слишком мало - первый же тест всосет все в память, и у следующих тестироваться будут не ввод\вывод, а чтение из кеша, а это уже не совсем реалистичные условия (выше Dummy00001 пишет, что там конфигурация, которую, видимо, загружают 1 раз при старте программы).
на линухе, man fadvise.
> “
> ”
Следствие копипасты или упоротости? Допустимы ли лапки («»)?
Но до сих пор так и делают.
Только вместо фото мне присылают скрины интерефейса.
Их сменили новые, которые не умеют вставлять фотографии даже в документы и все рассылают через ВКонтакт.
>Только вместо фото мне присылают скрины интерефейса.
А в качестве оплаты за консультации вставляют в документ сканы денег?
Сканы сисек