2017-02-10 21 views
1

いくつかのメソッドを取り除いた変更済みのSetインターフェイスを使用して作成した2つのResizableArraySetオブジェクトの結合と交差を検索しようとしています。私は両方のセットを渡して両方を処理するのに苦労しています。それは正確には起こりませんが、ここで私がしようとしていることをよりよく説明するコードがあります。私のテスターでの呼び出しです。2つのサイズ変更可能な配列セットの比較

System.out.println(Arrays.toString((set.union(set2)).toArray())); 

私はテスターで作ったオブジェクトです.set2は、setと比較するために作られた別のResizableArraySetオブジェクトです。私がそれを印刷すると、set2の配列が得られます。

ここには、コンストラクタとインスタンス変数があります。

public class ResizableArraySet<T> implements Set<T> { 

private int numberOfEntries; 
private int size; 
T[] array; 

/** 
* Constructor for Set without size variable (Default size is 10) 
*/ 
@SuppressWarnings({ "unchecked" }) 
public ResizableArraySet() { 
    array = (T[]) new Object[10]; 
} 

/** 
* Constructor for the Set with size variable 
* 
* @param size 
*/ 
@SuppressWarnings({ "unchecked" }) 
public ResizableArraySet(int size) { 
    this.size = size; 
    array = (T[]) new Object[size]; 
} 

ここで私のユニオンメソッドに関連するコードです。交差法が必要な場合、私はそれを編集で提供することができますが、問題は両方の方法で同じだと思います。ここで

@SuppressWarnings({ "unchecked", "unused" }) 
@Override 
public Set<T> union(Set<T> anotherSet) { 
    T[] newArray = (T[]) new Object[anotherSet.getSize()]; 
    int entries = this.size; 
    System.out.println(entries); //Get 0, when the size is not 0 
    for (int x = 0; x < entries; x++) { 
     if (anotherSet.contains(array[x]) == false) { 
      anotherSet.add(array[x]); 
     } 
    } 
    return anotherSet; 
} 

は、私の追加され、削除、だから私の問題を総括する方法

@Override 
public boolean add(T newEntry) { 
    if (contains(newEntry)) { 
     return false; 
    } else if (array.length > numberOfEntries) { 
     array[numberOfEntries] = newEntry; 
     numberOfEntries++; 
     return true; 
    } else { 
     array = Arrays.copyOf(array, (array.length * 2)); 
     array[numberOfEntries] = newEntry; 
     numberOfEntries++; 
     return true; 
    } 
} 

@Override 
public boolean remove(T anEntry) { 
    if (contains(anEntry) != true) { 
     return false; 
    } 
    for (int x = 0; x < numberOfEntries; x++) { 
     if (array[x].equals(anEntry)) { 
      // Loop to move the values down one index in the main array 
      for (int a = x; a < numberOfEntries; a++) { 
       array[a] = array[a + 1]; 
      } 
      numberOfEntries--; 
     } 
    } 
    return true; 
} 

@Override 
public boolean contains(T anEntry) { 
    for (int x = 0; x < numberOfEntries; x++) { 
     if (array[x].equals(anEntry)) { 
      return true; 
     } 
    } 
    return false; 
} 

が含まれています。私は両方のオブジェクトを比較するのに問題があります。なぜなら、両方とも同じメソッドを使用する必要があるからです。[contains(anEntry)、add(anEntry)、getSize()]

有用なコードが見つからない場合は教えてください。 誰かが私の問題に対する解決策を持っていますか?

+0

「numberOfEntries」はどこに設定されていますか? 'numberOfEntries'の代わりに' this.size() 'を呼び出せないのはなぜですか? –

+0

'numberOfEntries'が間違った値である場合、エントリをセットに追加し、セットからエントリを削除するコードはおそらくそれを正しく更新していません。 –

+0

@DarshanMehta numberOfEntriesは、コンストラクタの外部にあるインスタンス変数です。私はthis.sizeとthis.getSize()を呼び出すと、同じエラーが出ます。エントリはまだ0です。私はこのコード –

答えて

1

あなたの組合はどのように見えますか?実装する必要があるイテレータを使用します。これは、otherSet変数がSet<T>であり、ResizableArraySet<T>ではなく、その配列に直接アクセスできないためです。

public Set<T> union(Set<T> anotherSet) { 
    ResizableArraySet<T> newSet = new ResizableArraySet<>(); 
    for (int i = 0; i < numberOfEntries; i++) { 
     newSet.add(array[i]); 
    } 
    Iterator<T> it = anotherSet.iterator(); 
    while (it.hasNext()) { 
     T el = it.next(); 
     if (!newSet.contains(el)) { 
      newSet.add(el); 
     } 
    } 
    return newSet; 
} 
関連する問題