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

0

  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 3.14159265, (Updated )

Комментарии (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 тут - это говно
      Ответить
        • по сути это эквивалетно примерно такому
          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 - теоретически конечно

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

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

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

Семь раз отмерь — один отрежь, guest!

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


    8