2015-09-10 27 views
4

我有下面的類:創建一個iterator在Java中

public abstract class MapObjects<MapleMapObject> { 
    private Map map; 
    private HashMap<Integer, MapleMapObject> objects; 

    public MapObjects(Map map) { 
     this.map = map; 
     this.objects = new HashMap<>(); 
    } 

    public void add(MapleMapObject object) { 
     objects.put(map.getObjectId(), object); 

     onAdd(); 
    } 

    public void remove(MapleMapObject object) { 
     onRemove(); 

     objects.remove(object.getObjectId()); 
    } 

    protected abstract void onAdd(); 

    protected abstract void onRemove(); 
} 

我想創建一個迭代器,所以我可以遍歷從此類擴展類。舉例來說,如果我有一個類名爲MapCharacters extends MapObjects<Character>,我希望能夠做到以下幾點:

characters = new MapCharacters(this); 
for (Character character : characters) 

如何才能實現這一目標?

+1

對於增強的for循環語法的工作,MapCharacters必須實現'Iterable '。 – Jesper

+0

爲什麼在代碼示例中使用MapObjects ,然後在您的問題中討論MapObjects ?你應該使它通用? –

回答

9

如果你只是希望能夠遍歷objects地圖,你可以直接調用該values(),然後創建從該值設置一個迭代器:

public abstract class MapObjects<MapleMapObject> implements Iterable<MapleMapObject> { 

    ... 

    @Override public Iterator<MapleMapObject> iterator() { 
     return objects.values().iterator(); 
    } 
} 
0

您可以返回objects.values().iterator()但你應該知道該迭代器有一個remove()方法,您可以使用該方法刪除objects中的條目,而不調用onRemove()。這可能是也可能不是你想要的。

如果這不是你想要的,你可以返回一個Iterator其中remove方法拋出UnsupportedOperationException

return Collections.unmodifiableCollection(objects.values()).iterator(); 

或者,如果你想要一個Iteratorremove方法是刪除一個條目,並調用您的onRemove()方法,你將不得不自己寫一個實現Iterator的類。我認爲這樣的事情會起作用。

public abstract class MapObjects<MapleMapObject> implements Iterable<MapleMapObject> { 

    ... 

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

      private final Iterator<MapleMapObject> iterator = objects.values().iterator(); 

      @Override 
      public boolean hasNext() { 
       return iterator.hasNext(); 
      } 

      @Override 
      public MapleMapObject next() { 
       return iterator.next(); 
      } 

      @Override 
      public void remove() { 
       onRemove(); 
       iterator.remove(); 
      } 
     }; 
    } 
}