无法为队列的相同代码创建第二个套牌

时间:2014-02-28 05:57:04

标签: insert stack queue

我必须设置一个从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但是在第二个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;
}
}

1 个答案:

答案 0 :(得分:0)

我通过将SIZE变量作为类的实例变量移动并从中移除静态来解决了这个问题。我不知道为什么问题会在第二次迭代时出现,而不是在第一次尝试时出现,如果有人知道请在此处发布。