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)
此代码有两个问题:
(List)queue;那么我们有更优雅的方式来做到这一点吗?
澄清问题:
队列是否反转并不重要.我需要的是反转元素的int数组.
没必要在这里看到.
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)
不是单行,但易于阅读和快速.
首先,请不要使用原始类型(做用金刚石运营商).并不完全是一个衬垫,但你可以先转换为一个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)
该Collections.reverse只意味着到List这仅仅是一个类型的Collection,你不能施放Queue到List.但是您可以尝试将其转换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数组.
从别人已经提出另一种解决方案是扭转Stream的queue,然后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)