У меня есть две коллекции - ArrayList и Stack. Я использую стек, потому что мне нужна была простая функция pop/push для этого бита кода. ArrayList по существу является переменной out, так как это небольшая часть кода в функции.Самый эффективный способ перевернуть стек и добавить в ArrayList
Итак, переменные определены как таковые, затем выполняется код для добавления элементов в стек.
ArrayList<String> out = new ArrayList<String>();
/* other code.. */
Stack<String> lineStack = new Stack<String>();
/* code that adds stuff to the stack */
Вопрос заключается в том, что в настоящее время у меня есть полностью заселен стек, как я поместить его в из ArrayList в обратном порядке, то из поп-заказа.
Мое первое придуманное решение было
while(!lineStack.empty()) {
out.add(0, lineStack.pop());
}
... который работает, но я беспокоюсь об эффективности добавления элемента к началу ArrayList (который заставляет все существующие элементы, нужно перенести. это связанный список (я считаю) .. большое дело, но все равно беспокойство). Кроме того, я запускаю это через цикл ... возможно, излишне.
Итак, мое второе решение, которое не связано с циклом (по крайней мере, в моем коде, я уверен, что обратные вызовы делают это).
List l = lineStack.subList(0, lineStack.size());
out.addAll(l);
Я знаю, что мне не нужно выделять список, но он будет содержать более чистый код. Однако я не уверен, что это даст мне особенно полезную производительность.
Итак, мой вопрос: какие из них, вероятно, будут наиболее эффективными для наборов размеров от SMALL до MEDIUM? Если будет более эффективное решение, что бы это было?
Добавление к началу 'ArrayList' является дорогостоящим; это 'ArrayList' не' LinkedList'. Добавление его в начало - это «O (n^2)». – notnoop
Обратите внимание: 'Stack' является подклассом' Vector' (который почти похож на 'ArrayList'). В то время как выгружено, возможно, вы можете просто использовать его как «Вектор» вместо копирования списка. – notnoop
Вот что я понял. Оказывается, я просто иду с методом out.addAll (lineStack). Мне не нужно даже превращать его в объект списка. Это лишние накладные расходы. Итератор стека будет играть в правильном направлении, несмотря на то, что он был стекю –