Collections.reverse
подразумевает только List
, который является только одним типом Collection
, вы не можете разыграть Queue
до List
.Но вы можете попробовать привести его к LinkedList
как:
Collections.reverse((LinkedList)queue);
Подробности :
Я сомневаюсь, что есть встроенныйв API для реверсирования очереди.Вы все еще можете следовать обычному способу сделать это, используя Stack
как:
Stack<Integer> stack = new Stack<>();
while (!queue.isEmpty()) {
stack.add(queue.remove());
}
while (!stack.isEmpty()) {
queue.add(stack.pop());
}
, а затем преобразовать в массив, как вы будете
int[] res = queue.stream().mapToInt(Integer::intValue).toArray();
С другойИтак, если Deque
удовлетворяет вашим потребностям в настоящее время, вы можете просто положиться на сам LinkedList
, поскольку он также реализует Deque
.Тогда ваша текущая реализация будет такой простой:
LinkedList<Integer> dequeue = new LinkedList<>();
Collections.reverse(dequeue);
int[] res = dequeue.stream().mapToInt(Integer::intValue).toArray();
независимо от того, была ли очередь обращена, не важно.Мне нужен массив int обращенных элементов.
Другое решение из того, что уже предлагали другие, - обратить Stream
queue
и затем mapToInt
для преобразования вмассив как:
Queue<Integer> queue = new LinkedList<>();
int[] res = reverse(queue.stream()).mapToInt(Integer::intValue).toArray();
При этом используется утилита reverse
, предложенная Стюартом Марксом в этом ответе , такая что:
@SuppressWarnings("unchecked")
static <T> Stream<T> reverse(Stream<T> input) {
Object[] temp = input.toArray();
return (Stream<T>) IntStream.range(0, temp.length)
.mapToObj(i -> temp[temp.length - i - 1]);
}