-2

我现在被困在一种方法上。我需要编写一个方法,public boolean equals(CircularArray <T> m)该方法测试两个实现为循环数组的 FIFO 队列是否具有相同顺序的相同元素。例如,假设cd都是CircularArray<Integer>具有以下数据字段的类型:

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;
 }
4

1 回答 1

-1

你的数组声明:

T[] elements1;
T[] elements2;

似乎没有指定数组长度。您可以像这样初始化它们(编辑:这很hacky,最好不要使用原始数组):

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

(元素目前是私有的,您可能希望使用 getter 公开它的长度属性)。

于 2013-03-05T00:23:40.117 回答