2013-03-05 3 views
-2

Я застрял на методе прямо сейчас. Мне нужно написать метод, , который проверяет, имеют ли две очереди FIFO в виде круговых массивов одни и те же элементы в одном порядке. Например, предположим, что c и d оба типа CircularArray<Integer> со следующими полями данных:Circular Array Issue

c.elements = [null,null,7,11,7,4,null]  d.elements[7,4,null,7,11] 
c.start = 2         d.start = 3 
c.end = 6         d.end = 2 

Затем c.equals(d) должен возвращать true, поскольку концептуально они оба реализации очереди с элементами 7,11,7,4.

Я написал метод, который должен создать два новых массива, содержащих элементы в правильном порядке без нулевых элементов. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я думаю, что это концептуально правильно, я сталкиваюсь с ошибками. Прилагается мой метод и вся программа.

Вся программа:

// FIFO Queue implemented as circular array. 
// end field points after last element. Thus end==start for empty array. 

public class CircularArray<T> { 
private T[] elements; 
int start; 
int end; 

public CircularArray(T[] elts) { 
    elements = elts; 
    start = 0; 
    end = 0; 
} 

public boolean empty() { return end == start; } 

public boolean full() { 
    return ((start == 0 && end == elements.length-1) || end == start-1); 
} 

public void add(T x) { 
    if (!full()) { 
     elements[end] = x; 
     end++; 
     if (end == elements.length) end=0; 
    } 
} 

public T first() { return elements[start]; } 

public T pop() { 
    if (!empty()) { 
     T x = elements[start]; 
     start = start + 1; 
     if (start == elements.length) start = 0; 
     return x; 
    } 
    else return null; 
    } 

public String toString() { 
    String S = "["; 
    for (int i = start; i != end;) { 
     S = S + elements[i].toString() + " "; 
     i++; 
     if (i == elements.length) i = 0; 
    } 
    return S + "]"; 
    } 


    public static void main(String[] args) { 
    CircularArray<Integer> Q = new CircularArray<Integer>(new Integer[8]); 
     Q.add(null); 
     Q.add(null); 
     Q.add(7); 
     Q.add(11); 
     Q.add(7); 
     Q.add(4); 
     Q.add(null); 
     Q.start = 2; 
     Q.end = 6; 

     CircularArray<Integer> F = new CircularArray<Integer>(new Integer[5]); 
     F.add(7); 
     F.add(4); 
     F.add(null); 
     F.add(7); 
     F.add(11); 
     F.start = 3; 
     F.end = 2; 

     System.out.println(Q.equals(F)); 
} 
} 

Мой метод:

public boolean equals(CircularArray<T> m) 
{ 
    int a = 0; 
    int b = 0; 

    T[] elements1; 
    T[] elements2; 

    for(int i = start; i != end;) 
    { 
     elements1[a] = elements[i]; 
     a++; 
     if(i==elements.length) i=0; 
    } 
    for(int i = m.start; i != m.end;) 
    { 
     elements2[b] = elements[i]; 
     b++; 
     if(i==m.elements.length) i=0; 
    } 
    for(int i = 0; i <= elements.length;) 
    { 
     if(elements1[i] == elements2[i]) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+2

Перечислите ошибки, связанные с получением. – CookieOfFortune

+0

Упс, извините. Eclipse хочет, чтобы я инициализировал элементы1 и elements2, сделав их равными нулю, но это должно было бы сбросить нулевой указатель. Я просто хочу взять элементы в списках, поместить их в новые списки с нулевыми элементами и сравнить их. – JerryCrowley

+0

Не используйте массивы. Используйте ArrayList . – bmargulies

ответ

-1

Ваше объявление массива:

T[] elements1; 
T[] elements2; 

Не похоже, чтобы указать длину массива. Вы можете инициализировать их, как это (EDIT: Это Hacky, вы бы лучше не использовать сырые массивы):

T[] elements1 = (T[]) new Object[m.elements.length]; 
T[] elements2 = (T[]) new Object[m.elements.length]; 

(элементов является частным в данный момент, вы можете выставить его длина свойства с геттер).

+0

Я тоже пробовал это, но он говорит: «Невозможно создать общий массив T.» – JerryCrowley

+0

@ user51564 Я добавил редактирование. – CookieOfFortune

+0

Спасибо. Это работает. Мой метод продолжает циклироваться, поэтому, я думаю, мне придется исправить это или попробовать другой способ решения этой проблемы. – JerryCrowley