2014-02-28 25 views
0

我必須設置一個從deque類實現的隊列類。我需要用這個來隨機訂購兩張牌。我有下面的代碼,它在第一次創建甲板時起作用,但由於某種原因它不適用於第二次甲板,它與我重複使用的代碼相同。無法從同一代碼創建隊列的第二套牌

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 
    at prog.pkg4.Deque.insertOnBack(Prog4.java:93) 
at prog.pkg4.Queue.insert(Prog4.java:153) 
at prog.pkg4.Prog4.createDeck(Prog4.java:465) 
at prog.pkg4.Prog4.topTrump(Prog4.java:444) 
at prog.pkg4.Prog4.main(Prog4.java:287) 

啓動兩層甲板

Queue player = new Queue(); 
Queue computer = new Queue(); 
player = createDeck(player, cards); 
computer = createDeck(computer, cards); 

代碼來創建隨機甲板

public static Queue createDeck(Queue queue, GreekHero[] cards){ 
Random rand = new Random(); 
int temp = 0; 
int r; 
for(int i = 0; i < 30; i++){ 
    r = rand.nextInt(30); 
    cards[temp] = cards[i]; 
    cards[i] = cards[r]; 
    cards[r] = cards[temp]; 
} 
for(int i = 0; i < 29; i++){ 
    queue.insert(cards[i]); 
    System.out.println(queue.insertions()); 
    System.out.println(queue); 
} 
return queue; 

}

class Queue{ 
private Deque queue; 

public Queue(){ 
    queue = new Deque(); 
} 
public void insert(Object o){ 
    queue.insertOnBack(o); 
} 
public Object delete(){ 
    return queue.deleteFromFront(); 
} 
public boolean isEmpty(){ 
    return queue.isEmpty(); 
} 
public String toString(){ 
    return queue.toString(); 
} 
public int insertions(){ 
    return queue.getInsertions(); 
} 
} 

我測試了雙端隊列代碼幾次我知道它的工作原理,正如第一個所展示的甲板是創建,即時只是不知道是什麼可能導致第二套牌的問題。

編輯:我在下面添加了Deque類代碼,我設置的方式是,如果插入的數量等於數組的大小,它應該在大小上加倍,如前所述,它與第一個deque,但在第二個deque上,它停止在數組的大小 - 1.我增加了大小來測試,我可以使它更大,以滿足這個項目,但我需要創建一個日益增加的數組。

class Deque{ 
private Object[] arrayObject; 
private int beggining; //tracks first element in array 
private int insertions; //counts the items in the array 
private static int SIZE = 30; //size of array 

public Deque(){ 
    arrayObject = new Object[SIZE]; 
    beggining = 0; 
    insertions = 0; 
} 
// displays position of first element in circular array 
public Object getBeggining(){ 
    int temp = beggining + 1; 
    if(temp == SIZE) 
     temp = 0; 
    return temp; 
} 
public int getInsertions(){ 
    return insertions; 
} 
public Object indexOne(){ 
    int temp = beggining + 1; 
    if(temp == SIZE) 
     temp = 0; 
    return arrayObject[temp]; 
} 
public String toString(){ 
    if(isEmpty()) 
     return "Empty"; 
    int temp = beggining + 1; 
     if(temp >= SIZE) 
      temp = 0; 
    String s = "Current Index:\n[("+arrayObject[temp]+")"; 
    int loops = 0; 
    for(int i = temp + 1; loops < insertions - 1; i++){ 
     if(i >= SIZE) 
      i = 0; 
     s += ", ("+arrayObject[i]+")"; 
     loops++; 
    } 
    s += "]"; 
    return s; 
} 
public String toStore(){ 
    String s = "Store Index:\n[(1: "+arrayObject[1]+")"; 
    for(int i = 1; i <= SIZE - 1; i++) 
     s += ", ("+(i+1)+": "+arrayObject[i]+")"; 
    s += "]"; 
    return s; 
} 
public void insertOnFront(Object o){ 
    if(insertions == SIZE) 
     arrayObject = increaseArray(); 
    arrayObject[beggining] = o; 
    beggining--; 
    if(beggining < 0) 
     beggining = SIZE - 1; 
    insertions++; 
} 
public Object deleteFromFront(){ 
    if(isEmpty()) 
     return null; 
    int count = beggining + 1; 
     if(count >= SIZE) 
      count = 0; 
    Object temp = arrayObject[count]; 
    beggining += 1; 
    insertions--; 
    if(insertions > 0) 
     insertions = 0; 
    return temp; 
} 
public void insertOnBack(Object o){ 
    int temp = beggining + insertions + 1; 
    if(insertions == SIZE - 1) 
     arrayObject = increaseArray(); 
    if(temp >= SIZE) 
     temp = 0 + (temp - SIZE); 
    arrayObject[temp] = o; 
    insertions++; 
} 
public Object deleteFromBack(){ 
    if(isEmpty()) 
     return null; 
    int count = beggining + insertions; 
    Object temp = arrayObject[count]; 
    insertions--; 
    if(insertions >= 0) 
     insertions = 0; 
    return temp; 
} 
public boolean isEmpty(){ 
    if(insertions > 0) 
     return false; 
    else 
     return true; 
} 
public Object[] increaseArray(){ 
    SIZE *= 2; 
    int loops = 0; 
    int j = beggining; 
    Object[] newArray = new Object[SIZE]; 
    for(int i = j; loops <= SIZE/2; i++){ 
     if(j >= SIZE/2) 
      j = 0; 
     newArray[i] = arrayObject[j]; 
     loops++; 
     j++; 
    } 
    return newArray; 
} 
} 

回答

0

我通過將SIZE變量作爲類的實例變量移動並從中移除靜態來解決此問題。我不知道爲什麼這個問題在第二次迭代時出現,而不是第一次嘗試,如果有人知道,請稍後再查看。