反转队列<Integer>并将其转换为int数组

Zha*_*ang 11 java queue collections

我有一个Queue<Integer>声明为Queue<Integer> queue=new LinkedList();,我需要反转其中的元素顺序,然后将其转换为int数组.我在下面写了代码:

Collections.reverse((List)queue);
int[] res=queue.stream().mapToInt(Integer::intValue).toArray();
Run Code Online (Sandbox Code Playgroud)

此代码有两个问题:

  1. 表达铸造(List)queue;
  2. 我想知道是否有单线解决方案.

那么我们有更优雅的方式来做到这一点吗?


澄清问题:

队列是否反转并不重要.我需要的是反转元素的int数组.

xeh*_*puk 8

没必要在这里看到.

static int[] toReversedArray(Queue<Integer> queue) {
    int i = queue.size();
    int[] array = new int[i];
    for (int element : queue) {
        array[--i] = element;
    }
    return array;
}
Run Code Online (Sandbox Code Playgroud)

不是单行,但易于阅读和快速.


Ell*_*sch 6

首先,不要使用原始类型(用金刚石运营商).并不完全是一个衬垫,但你可以先转换为一个int[],然后使用公郎ArrayUtils.reverse(int[])

Queue<Integer> queue = new LinkedList<>();
// ...
int[] arr = queue.stream().mapToInt(Integer::intValue).toArray();
ArrayUtils.reverse(arr);
Run Code Online (Sandbox Code Playgroud)

您也可以编写自己的int[]反向方法,允许流畅的界面(例如,返回int[]),然后您可以使它成为一个班轮.喜欢,

public static int[] reverse(int[] arr) {
    for (int i = 0; i < arr.length / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[arr.length - i - 1];
        arr[arr.length - i - 1] = temp;
    }
    return arr;
}
Run Code Online (Sandbox Code Playgroud)

然后

int[] arr = reverse(queue.stream().mapToInt(Integer::intValue).toArray());
Run Code Online (Sandbox Code Playgroud)

  • @nullpointer真的.但是,如果目标是反转的`int []`那么不清楚队列是否也必须反转.事实上,我认为队列超出了范围,并且`int []`被返回给调用者. (2认同)

Nam*_*man 5

Collections.reverse只意味着到List这仅仅是一个类型的Collection,你不能施放QueueList.但是您可以尝试将其转换LinkedList为:

Collections.reverse((LinkedList)queue);
Run Code Online (Sandbox Code Playgroud)

细节:

我怀疑是否有用于反转队列的内置API.您仍然可以使用以下方式遵循传统方式Stack:

Stack<Integer> stack = new Stack<>();
while (!queue.isEmpty()) {
    stack.add(queue.remove());
}
while (!stack.isEmpty()) {
    queue.add(stack.pop());
}
Run Code Online (Sandbox Code Playgroud)

然后转换为数组

int[] res = queue.stream().mapToInt(Integer::intValue).toArray();
Run Code Online (Sandbox Code Playgroud)

另一方面,如果Deque满足您当前的需求,您可以简单地依赖LinkedList自身,因为它也实现了一个Deque.那么您当前的实现将如下所示:

LinkedList<Integer> dequeue = new LinkedList<>();
Collections.reverse(dequeue);
int[] res = dequeue.stream().mapToInt(Integer::intValue).toArray();
Run Code Online (Sandbox Code Playgroud)

队列是否反转并不重要.我需要的是反转元素的int数组.

从别人已经提出另一种解决方案是扭转Streamqueue,然后mapToInt转换到一个数组:

Queue<Integer> queue = new LinkedList<>();
int[] res = reverse(queue.stream()).mapToInt(Integer::intValue).toArray();
Run Code Online (Sandbox Code Playgroud)

这使用了reverseStuart Marks 在这个答案中提出的实用程序,这样:

@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]);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果使用`Deque`,使用`Deque.descendingIterator()`结合`Spliterators`和`StreamSupport`可能更有效,假设只需要反向数组而不是反转的'Deque`.但是,代码将更加冗长. (2认同)