簡體   English   中英

實現迭代器設計模式

[英]Implementing iterator design pattern

我有一個類 Example 女巫私有字段Hashmap<Integer, CustomObject> 我的目標是使用Iterable接口訪問CustomObject中的所有CustomObject實例。 首先,我聲明 Example 來實現Iterable<CustomObject> 然后我調用iterator()方法。 但是,我不知道是否應該指定hasNext()等,在主代碼中放什么? 這是我到目前為止所擁有的:

public class Example implements Iterable<Songs>{
  private HashMap <Integer, CustomObject>;

  @Override
  public Iterator<CustomObject> iterator() {
    for (CustomObject customObject: this){
      System.out.println(customObject);
    }

  public static void main(String[] args) {
    Example.iterator();
  }

實際上HashMap有一個方法Map::values()將值的集合作為Collection<T> ,它實際上是一個Iterable<T> (因此可以返回一個Iterator<T> )。

Map<Integer, CustomObject> map = new HashMap<>();
Iterator<CustomObject> iterator = map.values().iterator();

此外,您的代碼有幾個錯誤:

  • private HashMap <Integer, CustomObject>; 錯過了字段名稱和可能的啟動。
  • 實現Iterable<Songs>你必須覆蓋public Iterator<CustomObject> iterator() 我假設你的意思是class Example implements Iterable<CustomObject>
  • Iterable::iterator不是靜態方法,所以不能調用Example.iterator(); .

一個完整的例子,假設ExampleHashMap map的可迭代委托,就像在你的類中一樣(你忘記命名它,否則它不會編譯和初始化它),那么你可以這樣做:

public class Example implements Iterable<CustomObject> {

    private Map<Integer, CustomObject> delegate = ...; // initialize + data

    @Override
    public Iterator<CustomObject> iterator() {
        return this.delegate.values().iterator();
    }
}

並在以下任何片段中使用 like:

  • 只要Example是一個Iterable ,那么它就可以與增強循環一起使用:
     for (CustomObject customObject: new Example()) { // Iterable with enhanced loop System.out.println(customObject); }
  • 通過一個實際的Iterator
     Iterator<CustomObject> iterator = new Example().iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
  • 只要每個Iterable返回其Spliterator通過Stream
     StreamSupport.stream(new Example().spliterator(), false) .forEach(System.out::println);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM