【问题标题】:How do I get information out of the object returned by an iterators next() method?如何从迭代器 next() 方法返回的对象中获取信息?
【发布时间】:2014-04-11 11:17:11
【问题描述】:

我想将人员对象的目标变量(int 类型)与电梯对象的当前楼层变量(int 类型)进行比较。人员对象位于属于 Lift 类的 ListArray 中。我正在使用迭代器接口对 ListArray 进行迭代,以将每个人的目的地与电梯的当前楼层进行比较。方法 match(int destination) 用于返回 true 或 false。

这是我的代码不起作用:

Iterator iterator = lift.getOccupants().iterator();
while(iterator.hasNext()){
  if(lift.match(iterator.next().getDestination())){
  }

getDestination() 方法带有错误下划线:

找不到符号、方法getDestination()、位置类对象

【问题讨论】:

  • Java 5 已经快 10 年了,但似乎人们仍在阅读 90 年代的 Java 书籍

标签: java iterator


【解决方案1】:

next() 方法的返回类型是 Object,因此您需要将其类型转换为 Person 对象。
喜欢

((Person)iterator.next()).getDestination()  

否则,您可以使用像 List 这样的通用列表对象并通过它获取通用迭代器。

Iterator<Person> iterator = lift.getOccupants().iterator();

那么你就不需要任何强制转换了。

【讨论】:

  • 感谢铸造有意义!但是现在我在行中的 ((Person)iterator.next()) 出现错误: if(lift.match((Person)iterator.next()).getDestination()) 说明“不兼容的类型:LiftSimulator.Person无法转换为 int
【解决方案2】:

使用

Iterator<Occupant> iterator = lift.getOccupants().iterator();

涉及Iterator 的正确习语不是while,而是for-loop:

for (Iterator<Occupant> it = lift.getOccupants().iterator; it.hasNext();)
  if (lift.match(it.next().getDestination())) it.remove();

这样做的好处是保持it 的范围被包含。

【讨论】:

  • 使用 for each 循环是我的第一种方法,但因为我随后从 ListArray 中删除人员对象,同时仍对其进行迭代,所以它会产生 ConcurrentModificationException。因此使用迭代器接口是我的下一个方法。不幸的是,我对它不是很熟悉。
【解决方案3】:

参数化迭代器,这对你有用

    Iterator<Person> iterator = lift.getOccupants().iterator(); 
    while(iterator.hasNext()){ 
       if(lift.match(iterator.next().getDestination())){ 
       }
    }

【讨论】:

    【解决方案4】:

    使用 Java 8 Stream

    lift.getOccupants().stream()
                       .filter(o -> lift.match(o.getDestination()))
                       // ...
    

    【讨论】:

      【解决方案5】:

      像这样在java中使用泛型

        Iterator<Person> iterator = lift.getOccupants().iterator();
        while(iterator.hasNext()){  
        if(lift.match(iterator.next().getDestination())){   }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多