2014-02-28 1 views
0

deque 클래스에서 구현하는 대기열 클래스를 설정해야합니다. 임의의 순서로 2 개의 덱 카드를 설정하려면 이걸 사용해야합니다. 아래 코드는 첫 번째 데크가 만들어 졌을 때 작동하지만 두 번째 데크에서 작동하지 않는 이유는 재사용하는 동일한 코드입니다.대기열에 대해 동일한 코드에서 두 번째 데크를 만들 수 없습니다.

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) 

내가 밖으로 테스트 한

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(); 
} 
} 

임의 갑판

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; 

에게} 내가 알고있는 양단 큐 코드를 여러 번 생성하기 위해 두 개의 데크를

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

코드를 시작합니다 첫 작품에서 보여 주듯이 갑판이 만들어 졌는지, 두 번째 갑판에서 문제가 될 수 있는지 확실하지 않습니다.

EDIT : 아래에 Deque 클래스 코드를 추가했습니다.이 설정은 배열 크기와 같으면 크기가 두 배가되어야합니다. 첫 번째 deque하지만 두 번째 deque에서 배열 -1의 크기로 멈 춥니 다. 테스트 할 크기를 늘렸고이 프로젝트를 만족시키기 위해 크기를 늘릴 수는 있지만 늘어나는 배열로 deque를 작성해야합니다.

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 변수를 클래스의 인스턴스 변수로 이동하고 static을 제거하여 문제를 해결했습니다. 나는 두 번째 반복에서 첫 번째 시도보다는 뚜렷한 문제가 왜 발생했는지 알지 못합니다. 아쉽게도 여기에 게시하십시오.

관련 문제