2015-06-29 25 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

相關問題