2008-11-13 3 views
3

Я читаю файлы журнала, но не все строки хотят, чтобы их обрабатывали сразу. Я использую очередь/буфер для хранения строк, пока они ждут обработки.Лучшая коллекция для использования?

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

Таким образом, очередь необходимо следующее:

  • Возможность изменения размера (или такое впечатление)
  • ли элементы удалены из любого
  • ли элементы добавлены (всегда будет в конце очередь)
  • Быстро сканируется
  • В зависимости от производительности, указатель на то, где он был на последнем сканировании.

Первоначально я написал код, когда у меня было мало опыта Java или API, и просто использовал ArrayList, потому что я знал, что это сработает (не обязательно потому, что это был лучший вариант).

Его производительность в настоящее время становится бедной, и все больше журналов необходимо обрабатывать - так, какую коллекцию вы бы рекомендовали использовать в этой ситуации? Всегда есть возможность писать и мои собственные.

Thanks

ответ

6

LinkedHashSet может представлять интерес. Это эффективно HashSet, но он также поддерживает LinkedList, чтобы обеспечить предсказуемый порядок итераций - и поэтому может также использоваться как очередь FIFO, с хорошим добавленным преимуществом, которое не может содержать повторяющиеся записи.

Потому что это HashSet тоже поиск (в отличие от сканирования) могут быть O (1), если они могут совпадать по equals()

4

A LinkedList, вероятно, будет наиболее подходящим. Он имеет все запрашиваемые свойства и позволяет связывать ссылки с середины в постоянное время, а не линейное время, необходимое для ArrayList.

Если у вас есть определенная стратегия для поиска следующего элемента для удаления, приоритет может быть выбран PriorityQueue или даже отсортированный набор.

+0

Не будет ли связанный список медленным для поиска элементов, которые необходимо удалить? – 2008-11-13 10:17:21

+0

Это будет одна из нижних сторон LinkedList, потенциально медленный поиск – 2008-11-13 10:56:22

2

Отсканировано быстро, как правило, подразумевает реализацию на основе хэша, ConcurrentSkipListMap может быть хорошей реализацией. Запишите (n) в файле holdskey, удалите и получите методы и отсортируйте его, чтобы связать с ним какой-то приоритет.

0

Поскольку вам необходимо удалить и добавить элементы из набора и выполнить поиск определенных значений, возможно, лучшая структура может быть чем-то, что реализует SortedSet, например TreeSet. Этот класс гарантирует производительность log (n) для добавления, удаления и содержит.

0

Я думаю, что некоторые потоки собираются писать в очередь, а другой будет читать.

В этом случае вы должны посмотреть на очереди в пакете java.lang.concurrent.

Вы можете использовать PriorityBlockingQueue, чтобы он мог заказать элементы для вас или LinkedBlockingQueue, если вы хотите перебрать его и выбрать сами элементы для удаления.

1

Я не хочу сортировать строки, которые читаются (их нужно хранить в первоначальном порядке). Тем не менее, я могу потенциально блокировать строки на основе идентификатора сеанса, который имеет каждая строка в журнале (несколько протоколов в сеансе).

Думая об этом, я мог бы потенциально иметь:

HashMap<String,LinkedList<String>> 

и предоставить идентификатор сессии в качестве ключа, и заполнить LinkedList с линиями, принадлежащими к сеансу.

Карта предоставит быстрый способ поиска строк, относящихся к сеансу X, а затем связанный список обеспечит наилучшую производительность для добавления/удаления строк (производительность поиска заключалась в том, чтобы найти строки, относящиеся к сеансу x, поэтому фактические строки, относящиеся к сеансу x, могут быть прочитаны и удалены с начала до конца - нажаты/выведены).

Есть ли лучшая коллекция, чем связанный список, который будет изменять размер, добавить строки в конце и всегда брать с самого начала? Я полагаю, что коллекция Queue расширяет связанный список?

0

Я согласен с AVI и связный список будет лучшим вариантом. Вы можете легко изменить размер, быстро добавить в конец списка, быстро удалить из любого места. Поиск не будет быстрым, но не хуже любого другого несортированного списка.

0

Guava может помочь.

Проект гуава содержит несколько основных библиотеки Google, которые мы опираемся в наших проектах Java на основе: коллекции, кэширование, поддержка примитивов, параллелизм библиотеку, общие аннотации, обработки строк, I/O, и так далее.

Смежные вопросы