2016-03-31 9 views
0

コレクションを持つクラスでイテレータを使用したい辞書)を使用して、Iteratorを実装しました。どのようにできるのか? for-eachループを実行する必要がある場合、クラスのプライベートフィールドをコールバックする必要がありますか?ここ は、コレクションクラスのコードです:エラー "プライベートコレクションを含むクラスのイテレータを使用して"配列またはjava.lang.Iterableのインスタンスのみを反復できます "

public class ArrayDict<K, V> implements Dictionary<K, V> { 

Coppia<K, V>[] dict = new Coppia[1]; 
int n = 0; 

@Override 
public Iterator<K> iterator() { 
    return new Iterator<K>() { 

     private int i = 0; 

     @Override 
     public boolean hasNext() { 
      return i < n; 
     } 

     @Override 
     public K next() { 
      int pos = i; 
      i++; 
      return(K) dict[pos].key; 
     } 

    }; 
} 

@Override 
public void insert(K key, V value) { 

    if(search(key)==null) 
     throw new EccezioneChiavePresente("Chiave già presente"); 

    dict[n] = new Coppia<K,V>(key, value); 
    n++; 
    if (n == dict.length) { 
     Coppia<K,V>[] tmp = new Coppia[dict.length * 2]; 
     for (int i = 0; i < n; i++) 
      tmp[i] = dict[i]; 
     dict = tmp; 
    } 
} 

@Override 
public void delete(K key) { 
    if (n == 0) 
     throw new EccezioneDizionarioVuoto("Dizionario vuoto"); 
    if (search(key) == null) 
     throw new EccezioneChiaveNonPresente("Chiave non presente"); 
    int i; 
    for (i = 0; i < n; i++) 
     if (dict[i].key.equals(key)) 
      break; 
    for (int j = i; j < n - 1; j++) 
     dict[j] = dict[j + 1]; 
    n--; 
    if (n > 0 && n < dict.length/4) { 
     Coppia<K,V>[] tmp = new Coppia[dict.length/2]; 
     for (i = 0; i < n; i++) 
      tmp[i] = dict[i]; 
     dict = tmp; 
    } 
} 

@Override 
public V search(K key) { 
    if(n==0) 
     throw new EccezioneDizionarioVuoto("Dizionario vuoto"); 
    for (int i = 0; i < n; i++) 
     if (dict[i].key.equals(key)) 
      return dict[i].value; 
    return null; 
} 

}

そしてここでは、プライベートフィールドとしてコレクションを使用クラスの一部である:

public abstract class BibliotecaAbs { 

protected Dictionary<String, Record> volumi; 

public boolean bibliotecaVuota() { 
    try { 
     volumi.delete(""); 
    } catch (EccezioneDizionarioVuoto e) { 
     return true; 
    } 
    return false; 
} 

public void addVol(String posizione, Volume volume) { 
    try { 
     volumi.insert(posizione, new Record(volume, false)); 
    } catch (EccezioneChiavePresente e) { 
     throw new EccezioneScaffaleOccupato(); 
    } 
} 

は、当然のことながら私が得てきましたコンクリートはBibliotecaAbsになります。 は、私はこのような何かやりたい:

for(Object s : b){ 
     String intpos = s.toString(); 

をしかし、それは私にエラーをgaves:

Can only iterate over an array or an instance of java.lang.Iterable

は、どのように私はこの問題を解決することができますか?任意の助けがあります

答えて

2

BibliotecaAbsのクラス宣言にimplements Iterable<SomeType>を追加し、必要なメソッドpublic Iterator<SomeType> iterator()を実装します。

関連する問題