Я застрял на методе прямо сейчас. Мне нужно написать метод, , который проверяет, имеют ли две очереди 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;
}
Перечислите ошибки, связанные с получением. – CookieOfFortune
Упс, извините. Eclipse хочет, чтобы я инициализировал элементы1 и elements2, сделав их равными нулю, но это должно было бы сбросить нулевой указатель. Я просто хочу взять элементы в списках, поместить их в новые списки с нулевыми элементами и сравнить их. – JerryCrowley
Не используйте массивы. Используйте ArrayList. –
bmargulies