Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
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".
Видимо что-нибудь связанное с индексированием текстов. Хотя, имхо, чтение из файлов\сокетов запросто задавит всю разницу между стандартным сплитом у String, сплитом у Pattern и самопальным оптимизнутым split'ом.
просто вот так обычно кто-нить скажет "да сплит в жабе тормозит", "нельзя складывать строки" и т. п., кто-то краем глаза увидит и начнет писать свои сплиты и придумывать какие-то неведомые оптимизации в проекте не задумываясь о том, что у него и без сплита тормозов хватает.
ПС. У меня в проекте split по пробелу на наборе 70 000 - 75 000 строк делается за десятки миллисекунд
кому-то надо миллионы (миллиарды) строк засплитить, пробует стандартный сплит - типа медленно, после этого человек начинает на каждом углу говорить "не юзайте сплит - тормозит!" при этом не сообщая, что он гигабайты строк сплитит. кто-нибудь читает такое заявление и у него стереотип складывается "не буду юзать, а то тормозить будет!" и пишет что-нить свое.
Если вы говорите, что у вас что-то тормозит - говорите на каком объеме данных это происходит (или какова частота вызова метода).
Ну то, что split у самого String тормозной это понятно.
А можно сравнить ваш split со split'ом в Pattern (если паттерн заготовить 1 раз, перед распарсиванием файла)? Не будет ли тут большую часть времени занимать чтение с диска? (Если будете тестировать, то желательно на файле в 4+ гига, чтобы свести на нет эффект от файлового кеша).
это как раз и заставило меня приглядется и увидеть что `String.split(String)` на самом деле тоже сплитит по регулярке. и штатного сплита по букве в принципе не существует.
Просто если взять слишком мало - первый же тест всосет все в память, и у следующих тестироваться будут не ввод\вывод, а чтение из кеша, а это уже не совсем реалистичные условия (выше Dummy00001 пишет, что там конфигурация, которую, видимо, загружают 1 раз при старте программы).
Наше производство - EКO TEC осуществляет изготовление эко – технологий в сфере садоводства, а так же загородного жилья и всего что касается данной области. Наша компания приобрела значительны опыт в этой сфере, который используем, в нашей работе. Поэтому наша продукция имеет отличное качество тут http://teplitca.kiev.ua/g16745179-infrakrasnyj-plenochnyj-teplyj инфракрасный пол.
Еноты – прекрасные, сообразительные и невероятно очаровательные зверушки. Вот почему эти милахи становятся популярными знаменитостями сети,затмевая всеми любимых – котов. Понаблюдав за шалостями этих чудных зверушек, никто просто не сможет остаться к ним равнодушным, ведь на них не взглянешь без восторга. Еноты миловидные, энергичные и невероятно любознательные – в этих милах нереально не влюбиться. К тому же, эти животные падки на вкусную еду, в чем весьма схожи с нами. Их быстрые глазки окаймленные черной шерсткой добавляют их умильной мордочке особое очарование и выразительность <a href=https://24enota.ru/page/krokodil-enot>крокодил енот</a>. Благодаря необычайному притягательности и смешному поведению, енотов довольно часто заводят дома. большинству людей доставляет большое удовольствие смотреть за этим сообразительным созданием с его незаурядными повадками и безграничным любопытством. Хотя еноты – хищники, они довольно ласковые, контактные и миролюбивые, поэтому они вполне хорошо ладят с другими домашними питомцами– котами и собаками. Еноты-полоскуны довольно таки нежны и очень сильно привязываются к ко всем членам семьи своих хозяев, поэтому эти животные то и дело будут любым образом пытаться к себе привлечь Ваше внимание. Еноты-полоскуны широко распространены на территории всего Евразии, а завезены были они из Центральной и Северной Америки. Их удивительная приспосабливаемость к окружающей среде позволяет этим животным великолепно уживаться в местах с самым разным климатом – енотов можно встретить даже на территории Дальнего Востока. Благодаря цепким пальцам на лапах енотов-полоскунов они ловко управляются с даже очень маленькими предметами и превосходно лазят по деревьям. А необычайно подвижные ступни этих проворных зверьков позволяют им совершать невероятные акробатические трюки на деревьях.
Ну мне, как сишнику, этот код действительно с первого взгляда сразу понятный. Но в жабе я поюзал бы готовый 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.
> “
> ”
Следствие копипасты или упоротости? Допустимы ли лапки («»)?
Но до сих пор так и делают.
Только вместо фото мне присылают скрины интерефейса.
Их сменили новые, которые не умеют вставлять фотографии даже в документы и все рассылают через ВКонтакт.
>Только вместо фото мне присылают скрины интерефейса.
А в качестве оплаты за консультации вставляют в документ сканы денег?
Сканы сисек