Jawa / Говнокод #12561 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 taburetka, (Updated )

Комментарии (34) 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 миллионов строк. разница очень сильно заметна.

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

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

                Если вы говорите, что у вас что-то тормозит - говорите на каком объеме данных это происходит (или какова частота вызова метода).
                Ответить
          • Ну то, что 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с).
                Ответить
              • Значит 16+, как в кино 😉

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

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

            >Только вместо фото мне присылают скрины интерефейса.
            А в качестве оплаты за консультации вставляют в документ сканы денег?
            Ответить
  • Наше производство - EКO TEC осуществляет изготовление эко – технологий в сфере садоводства, а так же загородного жилья и всего что касается данной области.  Наша компания приобрела значительны опыт в этой сфере, который используем, в нашей работе. Поэтому наша продукция имеет отличное качество тут http://teplitca.kiev.ua/g16745179-infrakrasnyj-plenochnyj-teplyj инфракрасный пол.
    Ответить
  • Еноты – прекрасные, сообразительные и невероятно очаровательные зверушки. Вот почему эти милахи становятся популярными знаменитостями сети,затмевая всеми любимых – котов. Понаблюдав за шалостями этих чудных зверушек, никто просто не сможет остаться к ним равнодушным, ведь на них не взглянешь без восторга. Еноты миловидные, энергичные и невероятно любознательные – в этих милах нереально не влюбиться. К тому же, эти животные падки на вкусную еду, в чем весьма схожи с нами. Их быстрые глазки окаймленные черной шерсткой добавляют их умильной мордочке особое очарование и выразительность <a href=https://24enota.ru/page/krokodil-enot>крокодил енот</a>. Благодаря необычайному притягательности и смешному поведению, енотов довольно часто заводят дома. большинству людей доставляет большое удовольствие смотреть за этим сообразительным созданием с его незаурядными повадками и безграничным любопытством. Хотя еноты – хищники, они довольно ласковые, контактные и миролюбивые, поэтому они вполне хорошо ладят с другими домашними питомцами– котами и собаками. Еноты-полоскуны довольно таки нежны и очень сильно привязываются к ко всем членам семьи своих хозяев, поэтому эти животные то и дело будут любым образом пытаться к себе привлечь Ваше внимание. Еноты-полоскуны широко распространены на территории всего Евразии, а завезены были они из Центральной и Северной Америки. Их удивительная приспосабливаемость к окружающей среде позволяет этим животным великолепно уживаться в местах с самым разным климатом – енотов можно встретить даже на территории Дальнего Востока. Благодаря цепким пальцам на лапах енотов-полоскунов они ловко управляются с даже очень маленькими предметами и превосходно лазят по деревьям. А необычайно подвижные ступни этих проворных зверьков позволяют им совершать невероятные акробатические трюки на деревьях.
    Ответить
    • Завел у тебя в комнате семнадцать енотов, проверь
      Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8