2015-06-29 24 views
1

我必须编写一个程序,它在deque中添加整数,使得奇数添加到deque中的最后一个,并添加偶数第一。 我不知道在哪里添加if语句来添加数字以及如何让我的代码工作。 对不起,如果我的代码似乎是错误的,因为这是我的第一个程序deque。Java:基于它是奇数还是偶数,将整数置于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); 


    } 

} 
+0

你的程序不起作用?什么是期望的输出和什么是当前输出? – Marv

+0

我应该得到'[3,5,15,10,6]',但是我正在按照与添加'[10,3,5,6,15]'相同的顺序得到deque中的数字' – Tia

回答

2

@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); 

这将遍历inputArrayList并产生[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人数将在现在所希望的方式添加。

+0

非常感谢你!:-) – Tia

+0

我还没有真正理解覆盖方法..这就是_super_方法调用和所有..你能解释给我吗? – Tia

+0

这就像扩展LinkedList类,但匿名。你正在扩展这个类,并且只改变新创建的类中的add()方法,否则它的功能就像普通的LinkedList一样。super用于调用超类的方法,在这种情况下,该类是“LinkedList”。您在覆盖的add()方法内调用LinkedList的方法addLast()和addFirst()。 – Marv

2

所以,你没有在for循环得到正确结果的原因是因为d.poll()被检索(和删除)的双端队列的头。由于当前头是10并且是偶数,它将被添加到头部(即addFirst)。现在,因为它被重新添加到了双层机器人的头部,当我们再次进行轮询时,我们又得到了10个!所以,在循环结束时,deque保持与之前相同的状态。

这里有两个选项(IMO)。 (1)在将值添加到双端队列之前,检查INTEGER /数字是否为偶数/奇数。 (2)如果您坚持先将原始值添加到deque(在进行任何处理之前),则有一个单独的空双端队列来在FOR循环中保存最终结果。

无论哪种方式似乎很微不足道实施。如果您对我上面提到的内容有任何疑问,请随时通知我。

欢呼!

+0

谢谢!我实际上已经想过在将值添加到双端队列之前检查一个数字是否是偶数。你能告诉我它是如何完成的吗? – Tia

+0

当然。你已经有了for循环的逻辑。所以,当你在你的方法中收到一个整数时,我们称之为N,我们使用IF_ELSE语句来检查它是奇数还是偶数。如果(N%2 == 1) - > ODD - > d.addLast(N)else EVEN - > d.addFirst(N)。不需要FOR循环。 :) – cottonman

+0

非常感谢!:-) – Tia

相关问题