1. Java / Говнокод #12561

    +75

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 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);
    		}
    	}
    }

    Очень чёткий, простой и с первого взгляда сразу понятный способ сделатЬ сплит строки.

    Запостил: taburetka, 09 Февраля 2013

    Комментарии (32) RSS

    • > и с первого взгляда сразу понятный
      Ну мне, как сишнику, этот код действительно с первого взгляда сразу понятный. Но в жабе я поюзал бы готовый split.

      Кстати, из-за строки 10 оно всегда пропускает первый символ. И, если взять строку с пробелом в начале, в духе " shit happens", оно получит неправильный count, и разобьет эту строку на "" и "shit" просрав "happens".
      Ответить
      • Господин минусующий, будьте так любезны, изложите свою точку зрения.
        Ответить
      • > Но в жабе я поюзал бы готовый split.

        старая песня. штатный split в жабе использует регулярки и тормозит немеряно.

        я еще только двумя жабными проектами запачакался - но в обоих есть доморощенный сплит по символу.
        Ответить
        • > штатный split в жабе использует регулярки и тормозит немеряно

          простите, а какого типа приложения вы пишите, что скорость работы split становится критична?
          Ответить
          • Видимо что-нибудь связанное с индексированием текстов. Хотя, имхо, чтение из файлов\сокетов запросто задавит всю разницу между стандартным сплитом у String, сплитом у Pattern и самопальным оптимизнутым split'ом.
            Ответить
            • возможно

              просто вот так обычно кто-нить скажет "да сплит в жабе тормозит", "нельзя складывать строки" и т. п., кто-то краем глаза увидит и начнет писать свои сплиты и придумывать какие-то неведомые оптимизации в проекте не задумываясь о том, что у него и без сплита тормозов хватает.

              ПС. У меня в проекте split по пробелу на наборе 70 000 - 75 000 строк делается за десятки миллисекунд
              Ответить
              • "У меня в проекте split по пробелу на наборе 70 000 - 75 000 строк делается за десятки миллисекунд"

                у нас в CSV лежит конфигурация. от 4 до 12 миллионов строк. разница очень сильно заметна.

                (конфиг выдергивается из базы другим приложением, потому что основное приложение должно быть независимым от базы в рантайме.)
                Ответить
                • вот-вот

                  кому-то надо миллионы (миллиарды) строк засплитить, пробует стандартный сплит - типа медленно, после этого человек начинает на каждом углу говорить "не юзайте сплит - тормозит!" при этом не сообщая, что он гигабайты строк сплитит. кто-нибудь читает такое заявление и у него стереотип складывается "не буду юзать, а то тормозить будет!" и пишет что-нить свое.

                  Если вы говорите, что у вас что-то тормозит - говорите на каком объеме данных это происходит (или какова частота вызова метода).
                  Ответить
          • например чтение больших CSV файлов.
            Ответить
            • Ну то, что split у самого String тормозной это понятно.

              А можно сравнить ваш split со split'ом в Pattern (если паттерн заготовить 1 раз, перед распарсиванием файла)? Не будет ли тут большую часть времени занимать чтение с диска? (Если будете тестировать, то желательно на файле в 4+ гига, чтобы свести на нет эффект от файлового кеша).
              Ответить
              • лень. мне пока той аппликухой заниматся не надо. если будет шанс в будущем, то протестирую.

                ЗЫ это то что я нашел когда я собирался удалять доморощеный split:

                http://stackoverflow.com/questions/5965767/performance-of-stringtokenizer-class-vs-split-method-in-java

                это как раз и заставило меня приглядется и увидеть что `String.split(String)` на самом деле тоже сплитит по регулярке. и штатного сплита по букве в принципе не существует.
                Ответить
                • Потестил на файле в районе 4Гб (75млн строк), беру свои слова обратно, стандартные сплиты действительно лагают как говно.

                  Построчное чтение без сплитов - 28с.
                  String.split - 88с.
                  Pattern.split - 68c.
                  IndexOf (с сохранением частей в массив) - 39с.

                  В split'ах по показаниям профайлера около 35% времени уходит на java.util.regex.Matcher.find, т.е. ту самую регулярку.

                  P.S. Кстати, в седьмой джаве улучшили String.split, теперь он если видит один символ, то работает без регулярки (54с).
                  Ответить
              • >в 4+ гига
                >от файлового кеша
                а вдруг у меня кеш на 8?
                Ответить
                • Значит 16+, как в кино ;)

                  Просто если взять слишком мало - первый же тест всосет все в память, и у следующих тестироваться будут не ввод\вывод, а чтение из кеша, а это уже не совсем реалистичные условия (выше Dummy00001 пишет, что там конфигурация, которую, видимо, загружают 1 раз при старте программы).
                  Ответить
                  • просто я думаю, что и несколько сот мегов достаточно чтобы нивелировать действия кеша.
                    Ответить
                    • А вот кстати х.з. Линух, например, не любит чтобы память зря простаивала, и юзает всю свободную под кеш...
                      Ответить
                      • типа, считал файлик, а он всё равно остался в озу лежать на всякий случай?
                        Ответить
                        • Ага. А чего его убирать, если память сейчас никому не нужна? Пусть лежит, вдруг пригодится кому-то. Имхо хорошее решение.
                          Ответить
                        • ага. пока следующий файл его оттуда не выпрет.

                          на линухе, man fadvise.
                          Ответить
    • Сан дала им стандартную библиотеку, Гугл дал им Гуаву, но нет - "Я хочу создавать велосипеды и жрать говно!"
      Ответить
    • Семь раз отмерь - один отрежь!
      Ответить
    • Похоже на какую-то лабу, типа, зафигачте свой сплит
      Ответить
    • Господа, только заметил.
      > “
      > ”
      Следствие копипасты или упоротости? Допустимы ли лапки («»)?
      Ответить
      • Неа, недопустимы. Видимо копипастили через ворд.
        Ответить
        • вспоминаются девочки из чатов, которые фото присылали внутри doc.
          Ответить
          • Они уже выросли.
            Но до сих пор так и делают.
            Только вместо фото мне присылают скрины интерефейса.
            Ответить
            • >Они уже выросли.
              Их сменили новые, которые не умеют вставлять фотографии даже в документы и все рассылают через ВКонтакт.

              >Только вместо фото мне присылают скрины интерефейса.
              А в качестве оплаты за консультации вставляют в документ сканы денег?
              Ответить
              • >сканы денег
                Сканы сисек
                Ответить
                • Хуевы твои дела, чувак, если ты за сканы сисек работаешь
                  Ответить
    • Наше производство - EКO TEC осуществляет изготовление эко – технологий в сфере садоводства, а так же загородного жилья и всего что касается данной области.  Наша компания приобрела значительны опыт в этой сфере, который используем, в нашей работе. Поэтому наша продукция имеет отличное качество тут http://teplitca.kiev.ua/g16745179-infrakrasnyj-plenochnyj-teplyj инфракрасный пол.
      Ответить
      • Развел морковь в твоей теплице, проверь.
        Ответить
        • Как успехи? Есть ли смысл заниматься этим бизнесом?
          Ответить

    Добавить комментарий