Reversing a Queue and converting it into an int array
I have a Queue<Integer>
declared as Queue<Integer> queue=new LinkedList();
, I need to reverse the elments order in it, and then convert it into an int array. I wrote below code:
Collections.reverse((List)queue);
int res=queue.stream().mapToInt(Integer::intValue).toArray();
This code has two problems:
- the explict casting
(List)queue
; - I wonder if there is a one line solution.
So do we have any more elegant way to do this?
Clearification of the problem:
Whether the queue is reversed is not important. An int array of the reversed elements is what I need.
java collections queue
add a comment |
I have a Queue<Integer>
declared as Queue<Integer> queue=new LinkedList();
, I need to reverse the elments order in it, and then convert it into an int array. I wrote below code:
Collections.reverse((List)queue);
int res=queue.stream().mapToInt(Integer::intValue).toArray();
This code has two problems:
- the explict casting
(List)queue
; - I wonder if there is a one line solution.
So do we have any more elegant way to do this?
Clearification of the problem:
Whether the queue is reversed is not important. An int array of the reversed elements is what I need.
java collections queue
add a comment |
I have a Queue<Integer>
declared as Queue<Integer> queue=new LinkedList();
, I need to reverse the elments order in it, and then convert it into an int array. I wrote below code:
Collections.reverse((List)queue);
int res=queue.stream().mapToInt(Integer::intValue).toArray();
This code has two problems:
- the explict casting
(List)queue
; - I wonder if there is a one line solution.
So do we have any more elegant way to do this?
Clearification of the problem:
Whether the queue is reversed is not important. An int array of the reversed elements is what I need.
java collections queue
I have a Queue<Integer>
declared as Queue<Integer> queue=new LinkedList();
, I need to reverse the elments order in it, and then convert it into an int array. I wrote below code:
Collections.reverse((List)queue);
int res=queue.stream().mapToInt(Integer::intValue).toArray();
This code has two problems:
- the explict casting
(List)queue
; - I wonder if there is a one line solution.
So do we have any more elegant way to do this?
Clearification of the problem:
Whether the queue is reversed is not important. An int array of the reversed elements is what I need.
java collections queue
java collections queue
edited Jan 4 at 9:33
Moira
5,30321937
5,30321937
asked Jan 4 at 1:18
ZhaoGangZhaoGang
1,7581016
1,7581016
add a comment |
add a comment |
9 Answers
9
active
oldest
votes
First, please don't use raw types (do use the diamond operator). Not quite a one liner, but you could first convert to an int
and then use commons lang ArrayUtils.reverse(int)
like
Queue<Integer> queue = new LinkedList<>();
// ...
int arr = queue.stream().mapToInt(Integer::intValue).toArray();
ArrayUtils.reverse(arr);
You could also write your own int
reverse method that allowed for a fluent interface (e.g. return the int
) then you could make it a one liner. Like,
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;
}
And then
int arr = reverse(queue.stream().mapToInt(Integer::intValue).toArray());
but this wouldn't reverse the queue.
– nullpointer
Jan 4 at 1:39
2
@nullpointer True. But, if the goal is a reversedint
then it isn't clear that the queue must also be reversed. In fact, I would assume the queue goes out of scope and theint
is returned to the caller.
– Elliott Frisch
Jan 4 at 1:42
add a comment |
No need to get fancy here.
static int toReversedArray(Queue<Integer> queue) {
int i = queue.size();
int array = new int[i];
for (int element : queue) {
array[--i] = element;
}
return array;
}
Not a one-liner, but easy to read and fast.
add a comment |
The Collections.reverse
implies only to List
which is just one type of Collection
, you cannot cast a Queue
to a List
. But you can try casting it to a LinkedList
as:
Collections.reverse((LinkedList)queue);
Details:
I doubt that there is a built-in API for reversing the queue. You could still follow a conventional way of doing that using a Stack
as :
Stack<Integer> stack = new Stack<>();
while (!queue.isEmpty()) {
stack.add(queue.remove());
}
while (!stack.isEmpty()) {
queue.add(stack.pop());
}
and then convert to an array as you will
int res = queue.stream().mapToInt(Integer::intValue).toArray();
On the other hand, if a Deque
satisfies your needs currently, you can simply rely on the LinkedList
itself since it implements a Deque
as well. Then your current implementation would be as simple as :
LinkedList<Integer> dequeue = new LinkedList<>();
Collections.reverse(dequeue);
int res = dequeue.stream().mapToInt(Integer::intValue).toArray();
whether the queue is reversed is not important. An int array of the
reversed elements is what I need.
Another solution from what others have already suggested is to reverse the Stream
of the queue
and then mapToInt
to convert to an array as :
Queue<Integer> queue = new LinkedList<>();
int res = reverse(queue.stream()).mapToInt(Integer::intValue).toArray();
This uses a utility reverse
suggested by Stuart Marks in this answer such that:
@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]);
}
You should probably not be using theStack
class since it extendsVector
and is therefore synchronized, which is not needed here and only decreases performance.
– Marcono1234
Jan 4 at 2:39
2
If using aDeque
it might be more efficient to useDeque.descendingIterator()
combined withSpliterators
andStreamSupport
, assuming only the reversed array is needed and not the reversedDeque
. The code will be more verbose, however.
– Slaw
Jan 4 at 2:39
@Slaw It would be sure. Just that the intention of when I wrote the answer was to ensure the original store is reversed, but later the OP clarified that the reversed output is what matters eventually.
– nullpointer
Jan 4 at 3:43
@Marcono1234 actualy, the JVM does away with thesynchronized
blocks within theVector
class is its most recent versions when it detects they're are not shared and their aquisition cost is negligible :) but yeah, on principle you shouldn't do that asVector
is not recommended to be used anymore.
– João Rebelo
Jan 4 at 10:43
add a comment |
In Java8 version you can use Stream API to help you.
The skeleton of code like this:
int reversedQueue = queue.stream()
.collect(Collector.of(() -> new ArrayDeque<Integer>(), ArrayDeque::addFirst, (a,b)->a))
.stream().mapToInt(Integer::intValue).toArray();
It looks like your combiner ((a,b)->a
) is missingb
in the result
– Marcono1234
Jan 4 at 2:52
@Marcono1234 There is no problem.The third parameter ofCollector.of
method is oneBinaryOperator
it's the combiner function for the new collector. In our code there only one collector,so can't miss any element in collector.
– TongChen
Jan 4 at 3:24
it does not matter in this case probably since (if I understand it correctly) the combiner is only used for parallel streams. However, you should probably comment that the implementation is not correct, to prevent bugs in the future in case someone uses this code for a parallel stream. It should probably be(a, b) -> {b.addAll(a); return b;}
.
– Marcono1234
Jan 5 at 0:00
add a comment |
You can use the LazyIterate
utility from Eclipse Collections as follows.
int res = LazyIterate.adapt(queue)
.collectInt(i -> i)
.toList()
.asReversed()
.toArray();
You can also use the Collectors2
class with a Java Stream.
int ints = queue.stream()
.collect(Collectors2.collectInt(i -> i, IntLists.mutable::empty))
.asReversed()
.toArray();
You can stream the int
values directly into a MutableIntList
, reverse it, and then convert it to an int
array.
int ints =
IntLists.mutable.ofAll(queue.stream().mapToInt(i -> i)).asReversed().toArray();
Finally, you can stream the int
values directly into a MutableIntStack
and convert it to an int
array.
int ints =
IntStacks.mutable.ofAll(queue.stream().mapToInt(i -> i)).toArray();
Note: I am a committer for Eclipse Collections.
add a comment |
Finally, I figure out this one line solution.
Integer intArray = queue.stream()
.collect(LinkedList::new, LinkedList::addFirst, LinkedList::addAll)
.toArray(new Integer[queue.size()]);
the int
version should like
int intArray = queue.stream()
.collect(LinkedList<Integer>::new, LinkedList::addFirst, LinkedList::addAll)
.stream()
.mapToInt(Integer::intValue)
.toArray();
Thanks @Hulk, add theint
version, but I think I like theInteger
version, simpler.
– Keijack
Jan 4 at 8:05
add a comment |
This is one line, but it may not be very efficient:
int res = queue.stream()
.collect(LinkedList<Integer>::new, (l, e) -> l.addFirst(e), (l1, l2) -> l1.addAll(l2))
.stream()
.mapToInt(Integer::intValue)
.toArray();
If you want to be efficient and readable, you should continue using what you have now.
This does not reverse the queue (or its values)
– Marcono1234
Jan 4 at 2:50
add a comment |
Here is a different solution using Stream
and Collections.reverse()
in one line of code:
Integer reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.toArray(new Integer[0]);
}
));
OR
int reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.stream()
.mapToInt(Integer::intValue)
.toArray();
}
));
add a comment |
Here's a way that creates a reversed array without reversing the queue:
int i = { queue.size() };
int array = new int[i[0]];
queue.forEach(n -> array[--i[0]] = n);
The above code is quite hacky due to the impossibility to modify local variables from within lambda expressions. So here i
needs to be a one-element array, to overcome this restriction.
Note: bear in mind that I've come to this solution just for fun :)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54031994%2freversing-a-queueinteger-and-converting-it-into-an-int-array%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
9 Answers
9
active
oldest
votes
9 Answers
9
active
oldest
votes
active
oldest
votes
active
oldest
votes
First, please don't use raw types (do use the diamond operator). Not quite a one liner, but you could first convert to an int
and then use commons lang ArrayUtils.reverse(int)
like
Queue<Integer> queue = new LinkedList<>();
// ...
int arr = queue.stream().mapToInt(Integer::intValue).toArray();
ArrayUtils.reverse(arr);
You could also write your own int
reverse method that allowed for a fluent interface (e.g. return the int
) then you could make it a one liner. Like,
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;
}
And then
int arr = reverse(queue.stream().mapToInt(Integer::intValue).toArray());
but this wouldn't reverse the queue.
– nullpointer
Jan 4 at 1:39
2
@nullpointer True. But, if the goal is a reversedint
then it isn't clear that the queue must also be reversed. In fact, I would assume the queue goes out of scope and theint
is returned to the caller.
– Elliott Frisch
Jan 4 at 1:42
add a comment |
First, please don't use raw types (do use the diamond operator). Not quite a one liner, but you could first convert to an int
and then use commons lang ArrayUtils.reverse(int)
like
Queue<Integer> queue = new LinkedList<>();
// ...
int arr = queue.stream().mapToInt(Integer::intValue).toArray();
ArrayUtils.reverse(arr);
You could also write your own int
reverse method that allowed for a fluent interface (e.g. return the int
) then you could make it a one liner. Like,
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;
}
And then
int arr = reverse(queue.stream().mapToInt(Integer::intValue).toArray());
but this wouldn't reverse the queue.
– nullpointer
Jan 4 at 1:39
2
@nullpointer True. But, if the goal is a reversedint
then it isn't clear that the queue must also be reversed. In fact, I would assume the queue goes out of scope and theint
is returned to the caller.
– Elliott Frisch
Jan 4 at 1:42
add a comment |
First, please don't use raw types (do use the diamond operator). Not quite a one liner, but you could first convert to an int
and then use commons lang ArrayUtils.reverse(int)
like
Queue<Integer> queue = new LinkedList<>();
// ...
int arr = queue.stream().mapToInt(Integer::intValue).toArray();
ArrayUtils.reverse(arr);
You could also write your own int
reverse method that allowed for a fluent interface (e.g. return the int
) then you could make it a one liner. Like,
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;
}
And then
int arr = reverse(queue.stream().mapToInt(Integer::intValue).toArray());
First, please don't use raw types (do use the diamond operator). Not quite a one liner, but you could first convert to an int
and then use commons lang ArrayUtils.reverse(int)
like
Queue<Integer> queue = new LinkedList<>();
// ...
int arr = queue.stream().mapToInt(Integer::intValue).toArray();
ArrayUtils.reverse(arr);
You could also write your own int
reverse method that allowed for a fluent interface (e.g. return the int
) then you could make it a one liner. Like,
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;
}
And then
int arr = reverse(queue.stream().mapToInt(Integer::intValue).toArray());
answered Jan 4 at 1:35
Elliott FrischElliott Frisch
153k1389178
153k1389178
but this wouldn't reverse the queue.
– nullpointer
Jan 4 at 1:39
2
@nullpointer True. But, if the goal is a reversedint
then it isn't clear that the queue must also be reversed. In fact, I would assume the queue goes out of scope and theint
is returned to the caller.
– Elliott Frisch
Jan 4 at 1:42
add a comment |
but this wouldn't reverse the queue.
– nullpointer
Jan 4 at 1:39
2
@nullpointer True. But, if the goal is a reversedint
then it isn't clear that the queue must also be reversed. In fact, I would assume the queue goes out of scope and theint
is returned to the caller.
– Elliott Frisch
Jan 4 at 1:42
but this wouldn't reverse the queue.
– nullpointer
Jan 4 at 1:39
but this wouldn't reverse the queue.
– nullpointer
Jan 4 at 1:39
2
2
@nullpointer True. But, if the goal is a reversed
int
then it isn't clear that the queue must also be reversed. In fact, I would assume the queue goes out of scope and the int
is returned to the caller.– Elliott Frisch
Jan 4 at 1:42
@nullpointer True. But, if the goal is a reversed
int
then it isn't clear that the queue must also be reversed. In fact, I would assume the queue goes out of scope and the int
is returned to the caller.– Elliott Frisch
Jan 4 at 1:42
add a comment |
No need to get fancy here.
static int toReversedArray(Queue<Integer> queue) {
int i = queue.size();
int array = new int[i];
for (int element : queue) {
array[--i] = element;
}
return array;
}
Not a one-liner, but easy to read and fast.
add a comment |
No need to get fancy here.
static int toReversedArray(Queue<Integer> queue) {
int i = queue.size();
int array = new int[i];
for (int element : queue) {
array[--i] = element;
}
return array;
}
Not a one-liner, but easy to read and fast.
add a comment |
No need to get fancy here.
static int toReversedArray(Queue<Integer> queue) {
int i = queue.size();
int array = new int[i];
for (int element : queue) {
array[--i] = element;
}
return array;
}
Not a one-liner, but easy to read and fast.
No need to get fancy here.
static int toReversedArray(Queue<Integer> queue) {
int i = queue.size();
int array = new int[i];
for (int element : queue) {
array[--i] = element;
}
return array;
}
Not a one-liner, but easy to read and fast.
answered Jan 4 at 7:02
xehpukxehpuk
4,3172335
4,3172335
add a comment |
add a comment |
The Collections.reverse
implies only to List
which is just one type of Collection
, you cannot cast a Queue
to a List
. But you can try casting it to a LinkedList
as:
Collections.reverse((LinkedList)queue);
Details:
I doubt that there is a built-in API for reversing the queue. You could still follow a conventional way of doing that using a Stack
as :
Stack<Integer> stack = new Stack<>();
while (!queue.isEmpty()) {
stack.add(queue.remove());
}
while (!stack.isEmpty()) {
queue.add(stack.pop());
}
and then convert to an array as you will
int res = queue.stream().mapToInt(Integer::intValue).toArray();
On the other hand, if a Deque
satisfies your needs currently, you can simply rely on the LinkedList
itself since it implements a Deque
as well. Then your current implementation would be as simple as :
LinkedList<Integer> dequeue = new LinkedList<>();
Collections.reverse(dequeue);
int res = dequeue.stream().mapToInt(Integer::intValue).toArray();
whether the queue is reversed is not important. An int array of the
reversed elements is what I need.
Another solution from what others have already suggested is to reverse the Stream
of the queue
and then mapToInt
to convert to an array as :
Queue<Integer> queue = new LinkedList<>();
int res = reverse(queue.stream()).mapToInt(Integer::intValue).toArray();
This uses a utility reverse
suggested by Stuart Marks in this answer such that:
@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]);
}
You should probably not be using theStack
class since it extendsVector
and is therefore synchronized, which is not needed here and only decreases performance.
– Marcono1234
Jan 4 at 2:39
2
If using aDeque
it might be more efficient to useDeque.descendingIterator()
combined withSpliterators
andStreamSupport
, assuming only the reversed array is needed and not the reversedDeque
. The code will be more verbose, however.
– Slaw
Jan 4 at 2:39
@Slaw It would be sure. Just that the intention of when I wrote the answer was to ensure the original store is reversed, but later the OP clarified that the reversed output is what matters eventually.
– nullpointer
Jan 4 at 3:43
@Marcono1234 actualy, the JVM does away with thesynchronized
blocks within theVector
class is its most recent versions when it detects they're are not shared and their aquisition cost is negligible :) but yeah, on principle you shouldn't do that asVector
is not recommended to be used anymore.
– João Rebelo
Jan 4 at 10:43
add a comment |
The Collections.reverse
implies only to List
which is just one type of Collection
, you cannot cast a Queue
to a List
. But you can try casting it to a LinkedList
as:
Collections.reverse((LinkedList)queue);
Details:
I doubt that there is a built-in API for reversing the queue. You could still follow a conventional way of doing that using a Stack
as :
Stack<Integer> stack = new Stack<>();
while (!queue.isEmpty()) {
stack.add(queue.remove());
}
while (!stack.isEmpty()) {
queue.add(stack.pop());
}
and then convert to an array as you will
int res = queue.stream().mapToInt(Integer::intValue).toArray();
On the other hand, if a Deque
satisfies your needs currently, you can simply rely on the LinkedList
itself since it implements a Deque
as well. Then your current implementation would be as simple as :
LinkedList<Integer> dequeue = new LinkedList<>();
Collections.reverse(dequeue);
int res = dequeue.stream().mapToInt(Integer::intValue).toArray();
whether the queue is reversed is not important. An int array of the
reversed elements is what I need.
Another solution from what others have already suggested is to reverse the Stream
of the queue
and then mapToInt
to convert to an array as :
Queue<Integer> queue = new LinkedList<>();
int res = reverse(queue.stream()).mapToInt(Integer::intValue).toArray();
This uses a utility reverse
suggested by Stuart Marks in this answer such that:
@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]);
}
You should probably not be using theStack
class since it extendsVector
and is therefore synchronized, which is not needed here and only decreases performance.
– Marcono1234
Jan 4 at 2:39
2
If using aDeque
it might be more efficient to useDeque.descendingIterator()
combined withSpliterators
andStreamSupport
, assuming only the reversed array is needed and not the reversedDeque
. The code will be more verbose, however.
– Slaw
Jan 4 at 2:39
@Slaw It would be sure. Just that the intention of when I wrote the answer was to ensure the original store is reversed, but later the OP clarified that the reversed output is what matters eventually.
– nullpointer
Jan 4 at 3:43
@Marcono1234 actualy, the JVM does away with thesynchronized
blocks within theVector
class is its most recent versions when it detects they're are not shared and their aquisition cost is negligible :) but yeah, on principle you shouldn't do that asVector
is not recommended to be used anymore.
– João Rebelo
Jan 4 at 10:43
add a comment |
The Collections.reverse
implies only to List
which is just one type of Collection
, you cannot cast a Queue
to a List
. But you can try casting it to a LinkedList
as:
Collections.reverse((LinkedList)queue);
Details:
I doubt that there is a built-in API for reversing the queue. You could still follow a conventional way of doing that using a Stack
as :
Stack<Integer> stack = new Stack<>();
while (!queue.isEmpty()) {
stack.add(queue.remove());
}
while (!stack.isEmpty()) {
queue.add(stack.pop());
}
and then convert to an array as you will
int res = queue.stream().mapToInt(Integer::intValue).toArray();
On the other hand, if a Deque
satisfies your needs currently, you can simply rely on the LinkedList
itself since it implements a Deque
as well. Then your current implementation would be as simple as :
LinkedList<Integer> dequeue = new LinkedList<>();
Collections.reverse(dequeue);
int res = dequeue.stream().mapToInt(Integer::intValue).toArray();
whether the queue is reversed is not important. An int array of the
reversed elements is what I need.
Another solution from what others have already suggested is to reverse the Stream
of the queue
and then mapToInt
to convert to an array as :
Queue<Integer> queue = new LinkedList<>();
int res = reverse(queue.stream()).mapToInt(Integer::intValue).toArray();
This uses a utility reverse
suggested by Stuart Marks in this answer such that:
@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]);
}
The Collections.reverse
implies only to List
which is just one type of Collection
, you cannot cast a Queue
to a List
. But you can try casting it to a LinkedList
as:
Collections.reverse((LinkedList)queue);
Details:
I doubt that there is a built-in API for reversing the queue. You could still follow a conventional way of doing that using a Stack
as :
Stack<Integer> stack = new Stack<>();
while (!queue.isEmpty()) {
stack.add(queue.remove());
}
while (!stack.isEmpty()) {
queue.add(stack.pop());
}
and then convert to an array as you will
int res = queue.stream().mapToInt(Integer::intValue).toArray();
On the other hand, if a Deque
satisfies your needs currently, you can simply rely on the LinkedList
itself since it implements a Deque
as well. Then your current implementation would be as simple as :
LinkedList<Integer> dequeue = new LinkedList<>();
Collections.reverse(dequeue);
int res = dequeue.stream().mapToInt(Integer::intValue).toArray();
whether the queue is reversed is not important. An int array of the
reversed elements is what I need.
Another solution from what others have already suggested is to reverse the Stream
of the queue
and then mapToInt
to convert to an array as :
Queue<Integer> queue = new LinkedList<>();
int res = reverse(queue.stream()).mapToInt(Integer::intValue).toArray();
This uses a utility reverse
suggested by Stuart Marks in this answer such that:
@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]);
}
edited Jan 4 at 8:31
answered Jan 4 at 1:31
nullpointernullpointer
44.7k1096184
44.7k1096184
You should probably not be using theStack
class since it extendsVector
and is therefore synchronized, which is not needed here and only decreases performance.
– Marcono1234
Jan 4 at 2:39
2
If using aDeque
it might be more efficient to useDeque.descendingIterator()
combined withSpliterators
andStreamSupport
, assuming only the reversed array is needed and not the reversedDeque
. The code will be more verbose, however.
– Slaw
Jan 4 at 2:39
@Slaw It would be sure. Just that the intention of when I wrote the answer was to ensure the original store is reversed, but later the OP clarified that the reversed output is what matters eventually.
– nullpointer
Jan 4 at 3:43
@Marcono1234 actualy, the JVM does away with thesynchronized
blocks within theVector
class is its most recent versions when it detects they're are not shared and their aquisition cost is negligible :) but yeah, on principle you shouldn't do that asVector
is not recommended to be used anymore.
– João Rebelo
Jan 4 at 10:43
add a comment |
You should probably not be using theStack
class since it extendsVector
and is therefore synchronized, which is not needed here and only decreases performance.
– Marcono1234
Jan 4 at 2:39
2
If using aDeque
it might be more efficient to useDeque.descendingIterator()
combined withSpliterators
andStreamSupport
, assuming only the reversed array is needed and not the reversedDeque
. The code will be more verbose, however.
– Slaw
Jan 4 at 2:39
@Slaw It would be sure. Just that the intention of when I wrote the answer was to ensure the original store is reversed, but later the OP clarified that the reversed output is what matters eventually.
– nullpointer
Jan 4 at 3:43
@Marcono1234 actualy, the JVM does away with thesynchronized
blocks within theVector
class is its most recent versions when it detects they're are not shared and their aquisition cost is negligible :) but yeah, on principle you shouldn't do that asVector
is not recommended to be used anymore.
– João Rebelo
Jan 4 at 10:43
You should probably not be using the
Stack
class since it extends Vector
and is therefore synchronized, which is not needed here and only decreases performance.– Marcono1234
Jan 4 at 2:39
You should probably not be using the
Stack
class since it extends Vector
and is therefore synchronized, which is not needed here and only decreases performance.– Marcono1234
Jan 4 at 2:39
2
2
If using a
Deque
it might be more efficient to use Deque.descendingIterator()
combined with Spliterators
and StreamSupport
, assuming only the reversed array is needed and not the reversed Deque
. The code will be more verbose, however.– Slaw
Jan 4 at 2:39
If using a
Deque
it might be more efficient to use Deque.descendingIterator()
combined with Spliterators
and StreamSupport
, assuming only the reversed array is needed and not the reversed Deque
. The code will be more verbose, however.– Slaw
Jan 4 at 2:39
@Slaw It would be sure. Just that the intention of when I wrote the answer was to ensure the original store is reversed, but later the OP clarified that the reversed output is what matters eventually.
– nullpointer
Jan 4 at 3:43
@Slaw It would be sure. Just that the intention of when I wrote the answer was to ensure the original store is reversed, but later the OP clarified that the reversed output is what matters eventually.
– nullpointer
Jan 4 at 3:43
@Marcono1234 actualy, the JVM does away with the
synchronized
blocks within the Vector
class is its most recent versions when it detects they're are not shared and their aquisition cost is negligible :) but yeah, on principle you shouldn't do that as Vector
is not recommended to be used anymore.– João Rebelo
Jan 4 at 10:43
@Marcono1234 actualy, the JVM does away with the
synchronized
blocks within the Vector
class is its most recent versions when it detects they're are not shared and their aquisition cost is negligible :) but yeah, on principle you shouldn't do that as Vector
is not recommended to be used anymore.– João Rebelo
Jan 4 at 10:43
add a comment |
In Java8 version you can use Stream API to help you.
The skeleton of code like this:
int reversedQueue = queue.stream()
.collect(Collector.of(() -> new ArrayDeque<Integer>(), ArrayDeque::addFirst, (a,b)->a))
.stream().mapToInt(Integer::intValue).toArray();
It looks like your combiner ((a,b)->a
) is missingb
in the result
– Marcono1234
Jan 4 at 2:52
@Marcono1234 There is no problem.The third parameter ofCollector.of
method is oneBinaryOperator
it's the combiner function for the new collector. In our code there only one collector,so can't miss any element in collector.
– TongChen
Jan 4 at 3:24
it does not matter in this case probably since (if I understand it correctly) the combiner is only used for parallel streams. However, you should probably comment that the implementation is not correct, to prevent bugs in the future in case someone uses this code for a parallel stream. It should probably be(a, b) -> {b.addAll(a); return b;}
.
– Marcono1234
Jan 5 at 0:00
add a comment |
In Java8 version you can use Stream API to help you.
The skeleton of code like this:
int reversedQueue = queue.stream()
.collect(Collector.of(() -> new ArrayDeque<Integer>(), ArrayDeque::addFirst, (a,b)->a))
.stream().mapToInt(Integer::intValue).toArray();
It looks like your combiner ((a,b)->a
) is missingb
in the result
– Marcono1234
Jan 4 at 2:52
@Marcono1234 There is no problem.The third parameter ofCollector.of
method is oneBinaryOperator
it's the combiner function for the new collector. In our code there only one collector,so can't miss any element in collector.
– TongChen
Jan 4 at 3:24
it does not matter in this case probably since (if I understand it correctly) the combiner is only used for parallel streams. However, you should probably comment that the implementation is not correct, to prevent bugs in the future in case someone uses this code for a parallel stream. It should probably be(a, b) -> {b.addAll(a); return b;}
.
– Marcono1234
Jan 5 at 0:00
add a comment |
In Java8 version you can use Stream API to help you.
The skeleton of code like this:
int reversedQueue = queue.stream()
.collect(Collector.of(() -> new ArrayDeque<Integer>(), ArrayDeque::addFirst, (a,b)->a))
.stream().mapToInt(Integer::intValue).toArray();
In Java8 version you can use Stream API to help you.
The skeleton of code like this:
int reversedQueue = queue.stream()
.collect(Collector.of(() -> new ArrayDeque<Integer>(), ArrayDeque::addFirst, (a,b)->a))
.stream().mapToInt(Integer::intValue).toArray();
answered Jan 4 at 1:59
TongChenTongChen
20319
20319
It looks like your combiner ((a,b)->a
) is missingb
in the result
– Marcono1234
Jan 4 at 2:52
@Marcono1234 There is no problem.The third parameter ofCollector.of
method is oneBinaryOperator
it's the combiner function for the new collector. In our code there only one collector,so can't miss any element in collector.
– TongChen
Jan 4 at 3:24
it does not matter in this case probably since (if I understand it correctly) the combiner is only used for parallel streams. However, you should probably comment that the implementation is not correct, to prevent bugs in the future in case someone uses this code for a parallel stream. It should probably be(a, b) -> {b.addAll(a); return b;}
.
– Marcono1234
Jan 5 at 0:00
add a comment |
It looks like your combiner ((a,b)->a
) is missingb
in the result
– Marcono1234
Jan 4 at 2:52
@Marcono1234 There is no problem.The third parameter ofCollector.of
method is oneBinaryOperator
it's the combiner function for the new collector. In our code there only one collector,so can't miss any element in collector.
– TongChen
Jan 4 at 3:24
it does not matter in this case probably since (if I understand it correctly) the combiner is only used for parallel streams. However, you should probably comment that the implementation is not correct, to prevent bugs in the future in case someone uses this code for a parallel stream. It should probably be(a, b) -> {b.addAll(a); return b;}
.
– Marcono1234
Jan 5 at 0:00
It looks like your combiner (
(a,b)->a
) is missing b
in the result– Marcono1234
Jan 4 at 2:52
It looks like your combiner (
(a,b)->a
) is missing b
in the result– Marcono1234
Jan 4 at 2:52
@Marcono1234 There is no problem.The third parameter of
Collector.of
method is one BinaryOperator
it's the combiner function for the new collector. In our code there only one collector,so can't miss any element in collector.– TongChen
Jan 4 at 3:24
@Marcono1234 There is no problem.The third parameter of
Collector.of
method is one BinaryOperator
it's the combiner function for the new collector. In our code there only one collector,so can't miss any element in collector.– TongChen
Jan 4 at 3:24
it does not matter in this case probably since (if I understand it correctly) the combiner is only used for parallel streams. However, you should probably comment that the implementation is not correct, to prevent bugs in the future in case someone uses this code for a parallel stream. It should probably be
(a, b) -> {b.addAll(a); return b;}
.– Marcono1234
Jan 5 at 0:00
it does not matter in this case probably since (if I understand it correctly) the combiner is only used for parallel streams. However, you should probably comment that the implementation is not correct, to prevent bugs in the future in case someone uses this code for a parallel stream. It should probably be
(a, b) -> {b.addAll(a); return b;}
.– Marcono1234
Jan 5 at 0:00
add a comment |
You can use the LazyIterate
utility from Eclipse Collections as follows.
int res = LazyIterate.adapt(queue)
.collectInt(i -> i)
.toList()
.asReversed()
.toArray();
You can also use the Collectors2
class with a Java Stream.
int ints = queue.stream()
.collect(Collectors2.collectInt(i -> i, IntLists.mutable::empty))
.asReversed()
.toArray();
You can stream the int
values directly into a MutableIntList
, reverse it, and then convert it to an int
array.
int ints =
IntLists.mutable.ofAll(queue.stream().mapToInt(i -> i)).asReversed().toArray();
Finally, you can stream the int
values directly into a MutableIntStack
and convert it to an int
array.
int ints =
IntStacks.mutable.ofAll(queue.stream().mapToInt(i -> i)).toArray();
Note: I am a committer for Eclipse Collections.
add a comment |
You can use the LazyIterate
utility from Eclipse Collections as follows.
int res = LazyIterate.adapt(queue)
.collectInt(i -> i)
.toList()
.asReversed()
.toArray();
You can also use the Collectors2
class with a Java Stream.
int ints = queue.stream()
.collect(Collectors2.collectInt(i -> i, IntLists.mutable::empty))
.asReversed()
.toArray();
You can stream the int
values directly into a MutableIntList
, reverse it, and then convert it to an int
array.
int ints =
IntLists.mutable.ofAll(queue.stream().mapToInt(i -> i)).asReversed().toArray();
Finally, you can stream the int
values directly into a MutableIntStack
and convert it to an int
array.
int ints =
IntStacks.mutable.ofAll(queue.stream().mapToInt(i -> i)).toArray();
Note: I am a committer for Eclipse Collections.
add a comment |
You can use the LazyIterate
utility from Eclipse Collections as follows.
int res = LazyIterate.adapt(queue)
.collectInt(i -> i)
.toList()
.asReversed()
.toArray();
You can also use the Collectors2
class with a Java Stream.
int ints = queue.stream()
.collect(Collectors2.collectInt(i -> i, IntLists.mutable::empty))
.asReversed()
.toArray();
You can stream the int
values directly into a MutableIntList
, reverse it, and then convert it to an int
array.
int ints =
IntLists.mutable.ofAll(queue.stream().mapToInt(i -> i)).asReversed().toArray();
Finally, you can stream the int
values directly into a MutableIntStack
and convert it to an int
array.
int ints =
IntStacks.mutable.ofAll(queue.stream().mapToInt(i -> i)).toArray();
Note: I am a committer for Eclipse Collections.
You can use the LazyIterate
utility from Eclipse Collections as follows.
int res = LazyIterate.adapt(queue)
.collectInt(i -> i)
.toList()
.asReversed()
.toArray();
You can also use the Collectors2
class with a Java Stream.
int ints = queue.stream()
.collect(Collectors2.collectInt(i -> i, IntLists.mutable::empty))
.asReversed()
.toArray();
You can stream the int
values directly into a MutableIntList
, reverse it, and then convert it to an int
array.
int ints =
IntLists.mutable.ofAll(queue.stream().mapToInt(i -> i)).asReversed().toArray();
Finally, you can stream the int
values directly into a MutableIntStack
and convert it to an int
array.
int ints =
IntStacks.mutable.ofAll(queue.stream().mapToInt(i -> i)).toArray();
Note: I am a committer for Eclipse Collections.
edited Jan 4 at 6:51
answered Jan 4 at 3:36
Donald RaabDonald Raab
4,22112029
4,22112029
add a comment |
add a comment |
Finally, I figure out this one line solution.
Integer intArray = queue.stream()
.collect(LinkedList::new, LinkedList::addFirst, LinkedList::addAll)
.toArray(new Integer[queue.size()]);
the int
version should like
int intArray = queue.stream()
.collect(LinkedList<Integer>::new, LinkedList::addFirst, LinkedList::addAll)
.stream()
.mapToInt(Integer::intValue)
.toArray();
Thanks @Hulk, add theint
version, but I think I like theInteger
version, simpler.
– Keijack
Jan 4 at 8:05
add a comment |
Finally, I figure out this one line solution.
Integer intArray = queue.stream()
.collect(LinkedList::new, LinkedList::addFirst, LinkedList::addAll)
.toArray(new Integer[queue.size()]);
the int
version should like
int intArray = queue.stream()
.collect(LinkedList<Integer>::new, LinkedList::addFirst, LinkedList::addAll)
.stream()
.mapToInt(Integer::intValue)
.toArray();
Thanks @Hulk, add theint
version, but I think I like theInteger
version, simpler.
– Keijack
Jan 4 at 8:05
add a comment |
Finally, I figure out this one line solution.
Integer intArray = queue.stream()
.collect(LinkedList::new, LinkedList::addFirst, LinkedList::addAll)
.toArray(new Integer[queue.size()]);
the int
version should like
int intArray = queue.stream()
.collect(LinkedList<Integer>::new, LinkedList::addFirst, LinkedList::addAll)
.stream()
.mapToInt(Integer::intValue)
.toArray();
Finally, I figure out this one line solution.
Integer intArray = queue.stream()
.collect(LinkedList::new, LinkedList::addFirst, LinkedList::addAll)
.toArray(new Integer[queue.size()]);
the int
version should like
int intArray = queue.stream()
.collect(LinkedList<Integer>::new, LinkedList::addFirst, LinkedList::addAll)
.stream()
.mapToInt(Integer::intValue)
.toArray();
edited Jan 4 at 8:03
answered Jan 4 at 1:42
KeijackKeijack
1666
1666
Thanks @Hulk, add theint
version, but I think I like theInteger
version, simpler.
– Keijack
Jan 4 at 8:05
add a comment |
Thanks @Hulk, add theint
version, but I think I like theInteger
version, simpler.
– Keijack
Jan 4 at 8:05
Thanks @Hulk, add the
int
version, but I think I like the Integer
version, simpler.– Keijack
Jan 4 at 8:05
Thanks @Hulk, add the
int
version, but I think I like the Integer
version, simpler.– Keijack
Jan 4 at 8:05
add a comment |
This is one line, but it may not be very efficient:
int res = queue.stream()
.collect(LinkedList<Integer>::new, (l, e) -> l.addFirst(e), (l1, l2) -> l1.addAll(l2))
.stream()
.mapToInt(Integer::intValue)
.toArray();
If you want to be efficient and readable, you should continue using what you have now.
This does not reverse the queue (or its values)
– Marcono1234
Jan 4 at 2:50
add a comment |
This is one line, but it may not be very efficient:
int res = queue.stream()
.collect(LinkedList<Integer>::new, (l, e) -> l.addFirst(e), (l1, l2) -> l1.addAll(l2))
.stream()
.mapToInt(Integer::intValue)
.toArray();
If you want to be efficient and readable, you should continue using what you have now.
This does not reverse the queue (or its values)
– Marcono1234
Jan 4 at 2:50
add a comment |
This is one line, but it may not be very efficient:
int res = queue.stream()
.collect(LinkedList<Integer>::new, (l, e) -> l.addFirst(e), (l1, l2) -> l1.addAll(l2))
.stream()
.mapToInt(Integer::intValue)
.toArray();
If you want to be efficient and readable, you should continue using what you have now.
This is one line, but it may not be very efficient:
int res = queue.stream()
.collect(LinkedList<Integer>::new, (l, e) -> l.addFirst(e), (l1, l2) -> l1.addAll(l2))
.stream()
.mapToInt(Integer::intValue)
.toArray();
If you want to be efficient and readable, you should continue using what you have now.
edited Jan 4 at 8:01
ZhaoGang
1,7581016
1,7581016
answered Jan 4 at 1:53
JaiJai
5,73311231
5,73311231
This does not reverse the queue (or its values)
– Marcono1234
Jan 4 at 2:50
add a comment |
This does not reverse the queue (or its values)
– Marcono1234
Jan 4 at 2:50
This does not reverse the queue (or its values)
– Marcono1234
Jan 4 at 2:50
This does not reverse the queue (or its values)
– Marcono1234
Jan 4 at 2:50
add a comment |
Here is a different solution using Stream
and Collections.reverse()
in one line of code:
Integer reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.toArray(new Integer[0]);
}
));
OR
int reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.stream()
.mapToInt(Integer::intValue)
.toArray();
}
));
add a comment |
Here is a different solution using Stream
and Collections.reverse()
in one line of code:
Integer reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.toArray(new Integer[0]);
}
));
OR
int reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.stream()
.mapToInt(Integer::intValue)
.toArray();
}
));
add a comment |
Here is a different solution using Stream
and Collections.reverse()
in one line of code:
Integer reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.toArray(new Integer[0]);
}
));
OR
int reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.stream()
.mapToInt(Integer::intValue)
.toArray();
}
));
Here is a different solution using Stream
and Collections.reverse()
in one line of code:
Integer reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.toArray(new Integer[0]);
}
));
OR
int reversedArray = queue.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
Collections.reverse(list);
return list.stream()
.mapToInt(Integer::intValue)
.toArray();
}
));
edited Jan 4 at 9:33
answered Jan 4 at 9:17
aminographyaminography
5,78521131
5,78521131
add a comment |
add a comment |
Here's a way that creates a reversed array without reversing the queue:
int i = { queue.size() };
int array = new int[i[0]];
queue.forEach(n -> array[--i[0]] = n);
The above code is quite hacky due to the impossibility to modify local variables from within lambda expressions. So here i
needs to be a one-element array, to overcome this restriction.
Note: bear in mind that I've come to this solution just for fun :)
add a comment |
Here's a way that creates a reversed array without reversing the queue:
int i = { queue.size() };
int array = new int[i[0]];
queue.forEach(n -> array[--i[0]] = n);
The above code is quite hacky due to the impossibility to modify local variables from within lambda expressions. So here i
needs to be a one-element array, to overcome this restriction.
Note: bear in mind that I've come to this solution just for fun :)
add a comment |
Here's a way that creates a reversed array without reversing the queue:
int i = { queue.size() };
int array = new int[i[0]];
queue.forEach(n -> array[--i[0]] = n);
The above code is quite hacky due to the impossibility to modify local variables from within lambda expressions. So here i
needs to be a one-element array, to overcome this restriction.
Note: bear in mind that I've come to this solution just for fun :)
Here's a way that creates a reversed array without reversing the queue:
int i = { queue.size() };
int array = new int[i[0]];
queue.forEach(n -> array[--i[0]] = n);
The above code is quite hacky due to the impossibility to modify local variables from within lambda expressions. So here i
needs to be a one-element array, to overcome this restriction.
Note: bear in mind that I've come to this solution just for fun :)
edited Jan 5 at 17:06
answered Jan 5 at 16:53
Federico Peralta SchaffnerFederico Peralta Schaffner
22.2k43572
22.2k43572
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54031994%2freversing-a-queueinteger-and-converting-it-into-an-int-array%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown