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

    +112

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    private List<String> tList = new ArrayList<String>();
                ...........
    	for (String refAttr : refAttrs) {
    		t = tag.getAttribute(refAttr);
    		if (!tList.contains(t))
    			if (isCorrect(t))
    				tList.add(t);
            }

    как-то позабыл я о Сетах

    Запостил: 3.14159265, 09 Августа 2010

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

    • о великий Сет!
      Ответить
    • на самом деле не стоит просто неоптимальное решение записывать в говнокод...
      Ответить
      • возможно. но на говнокоде уже было многое, а такого я не видел.
        как по мне - это тупость - равная использованию массива - и тупого перебора в нем циклом - вместо бинарного поиска или HashSeta.
        когда в листе полно записей - код будет тормозить из-за
        public boolean contains(Object elem) {
        	return indexOf(elem) >= 0;
            }
        
            /**
             * Searches for the first occurence of the given argument, testing 
             * for equality using the <tt>equals</tt> method. 
             *
             * @param   elem   an object.
             * @return  the index of the first occurrence of the argument in this
             *          list; returns <tt>-1</tt> if the object is not found.
             * @see     Object#equals(Object)
             */
            public int indexOf(Object elem) {
        	if (elem == null) {
        	    for (int i = 0; i < size; i++)
        		if (elementData[i]==null)
        		    return i;
        	} else {
        	    for (int i = 0; i < size; i++)
        		if (elem.equals(elementData[i]))
        		    return i;
        	}
        	return -1;
            }


        как по мне использование ArrayLista тут - это говно
        Ответить
      • или че мне постить - очередную говнокопипасту на 10 страниц вместо цикла?
        вот седня есть такая http://govnokod.ru/3920 и вчера была http://govnokod.ru/3911 итд
        Ответить
        • что-нибудь необычное хотелось бы увидеть
          Ответить
          • по сути это эквивалетно примерно такому
            for (String refAttr : refAttrs) {
            	t = tag.getAttribute(refAttr);
            	     if (t!=null)
            	      if (isCorrect(t))
            		for (int i = 0; i < tList.size(); i++)
            			if (е.equals(tList.get(i)))
            				tList.add(t);

            а после замены тупого перебора на Set с бинарным поиском общая скорость выросла в 2-2.5 раза
            так что ИМХО - говно
            Ответить
    • Вы не просто позабыли о сетах, Вы еще и позабыли что структуры для хранения данных надо бы выносить в отдельные классы, а не вмазывать их в логику, в перемегшку в isCorrecT)
      Ответить
    • Кстати, Set<T> даёт не эквивалентный результат. Вполне может быть, что нужно ещё и сохранить порядок элементов, убрав дублирующиеся (сохранив только первое вхождение таких элементов). Если порядок элементов неважен, то что разумнее использовать - List или Set - определяется размером коллекции и сложнойстью вычисления хэша. А то может быть, что перебор 5-6 элементов окажется быстрее, чем вычислять хэш-функции и бороться с коллизиями.
      Ответить
      • >>>А то может быть, что перебор 5-6 элементов окажется быстрее, чем вычислять хэш-функции и бороться с коллизиями.

        бесспорно.
        поэтому как я уже говорил http://govnokod.ru/3921#comment41949 использую [Set с бинарным поиском]
        This implementation provides guaranteed log2(n) time cost for the <tt>containsKey</tt>, <tt>get</tt>, <tt>put</tt> and <tt>remove</tt>operations.
        A начиная как раз с 5 элементов дерево оказывается быстрее
        log2(5)<5/2 - теоретически конечно

        >>>Вы еще и позабыли что структуры для хранения данных надо бы выносить в отдельные классы, а не вмазывать их в логику

        Неплохая идея.
        Ответить

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