Java:根据双端队列是奇数还是偶数将整数放在首位或末尾
Java: placing integers first or last in a deque based on whether it is odd or even
我必须编写一个程序,在双端队列中添加整数,以便在双端队列中最后添加奇数,首先添加偶数。
我不知道在哪里添加用于添加数字的 if 语句以及如何使我的代码工作。
对不起,如果我的代码似乎有误,因为这是我在 deque 上的第一个程序。
package lesson1;
import java.util.*;
public class MyClass1{
public static void main(String[] args) {
Deque<Integer> d= new LinkedList<Integer>();
d.add(10);
d.add(3);
d.add(5);
d.add(6);
d.add(15);
for(int i=0; i<d.size();i++){
Integer head= d.poll();
if(head%2==1){
d.addLast(head);
}
else{
d.addFirst(head);
}
}
System.out.println(d);
}
}
所以,您在 for 循环后没有得到正确结果的原因是因为 d.poll() 正在检索(和删除)双端队列的头部。由于当前head是10,而且是偶数,所以会加到head上(即addFirst)。现在,因为它被重新添加到双端队列的头部,当我们再次轮询时,我们又得到 10!因此,在循环结束时,双端队列保持与之前相同的状态。
这里有两个选项 (IMO)。
(1) 在将值添加到双端队列之前检查 INTEGER/number 是否为 even/odd。
(2) 如果您坚持首先将原始值添加到双端队列(在进行任何处理之前),请使用一个单独的空双端队列来保存 FOR 循环中的最终结果。
这两种方法似乎都很容易实现。如果您对我上面提到的内容有任何疑问,请随时告诉我。
加油!
@cottonman 是正确的,我确实会像这样使用单独的输入列表:
ArrayList<Integer> input = new ArrayList<>();
Deque<Integer> d = new LinkedList<>();
input.add(10);
input.add(3);
input.add(5);
input.add(6);
input.add(15);
for (Integer i : input) {
if (i % 2 == 1) {
d.addLast(i);
} else {
d.addFirst(i);
}
}
System.out.println(d);
这将遍历 input
ArrayList
并产生 [6, 10, 3, 5, 15]
,这是您想要的(奇数在后,偶数在前)。
编辑:要回答@cottonman 的问题,确实可以在添加时进行检查。为此,您可以匿名扩展 LinkedList
并覆盖 add()
方法:
Deque<Integer> d = new LinkedList<Integer>() {
@Override
public boolean add(Integer integer) {
if (integer % 2 == 1) {
super.addLast(integer);
} else {
super.addFirst(integer);
}
return true;
}
};
d.add(10);
d.add(3);
d.add(5);
d.add(6);
d.add(15);
System.out.println(d);
这也将打印所需的输出,现在添加到 Deque
的每个数字都将以所需的方式添加。
我必须编写一个程序,在双端队列中添加整数,以便在双端队列中最后添加奇数,首先添加偶数。 我不知道在哪里添加用于添加数字的 if 语句以及如何使我的代码工作。 对不起,如果我的代码似乎有误,因为这是我在 deque 上的第一个程序。
package lesson1;
import java.util.*;
public class MyClass1{
public static void main(String[] args) {
Deque<Integer> d= new LinkedList<Integer>();
d.add(10);
d.add(3);
d.add(5);
d.add(6);
d.add(15);
for(int i=0; i<d.size();i++){
Integer head= d.poll();
if(head%2==1){
d.addLast(head);
}
else{
d.addFirst(head);
}
}
System.out.println(d);
}
}
所以,您在 for 循环后没有得到正确结果的原因是因为 d.poll() 正在检索(和删除)双端队列的头部。由于当前head是10,而且是偶数,所以会加到head上(即addFirst)。现在,因为它被重新添加到双端队列的头部,当我们再次轮询时,我们又得到 10!因此,在循环结束时,双端队列保持与之前相同的状态。
这里有两个选项 (IMO)。
(1) 在将值添加到双端队列之前检查 INTEGER/number 是否为 even/odd。
(2) 如果您坚持首先将原始值添加到双端队列(在进行任何处理之前),请使用一个单独的空双端队列来保存 FOR 循环中的最终结果。
这两种方法似乎都很容易实现。如果您对我上面提到的内容有任何疑问,请随时告诉我。
加油!
@cottonman 是正确的,我确实会像这样使用单独的输入列表:
ArrayList<Integer> input = new ArrayList<>();
Deque<Integer> d = new LinkedList<>();
input.add(10);
input.add(3);
input.add(5);
input.add(6);
input.add(15);
for (Integer i : input) {
if (i % 2 == 1) {
d.addLast(i);
} else {
d.addFirst(i);
}
}
System.out.println(d);
这将遍历 input
ArrayList
并产生 [6, 10, 3, 5, 15]
,这是您想要的(奇数在后,偶数在前)。
编辑:要回答@cottonman 的问题,确实可以在添加时进行检查。为此,您可以匿名扩展 LinkedList
并覆盖 add()
方法:
Deque<Integer> d = new LinkedList<Integer>() {
@Override
public boolean add(Integer integer) {
if (integer % 2 == 1) {
super.addLast(integer);
} else {
super.addFirst(integer);
}
return true;
}
};
d.add(10);
d.add(3);
d.add(5);
d.add(6);
d.add(15);
System.out.println(d);
这也将打印所需的输出,现在添加到 Deque
的每个数字都将以所需的方式添加。