【问题标题】:Java problem iterating through a treemap collection of classes遍历类的树形图集合的Java问题
【发布时间】:2011-09-05 16:10:34
【问题描述】:

我正在尝试使用以下方法遍历 Tile() 类的 Treemap:

Map map = new TreeMap();

Iterator itr = world.map.values().iterator();

while(itr.hasNext()){
     Tile t = ???;
     System.out.print(t.xCord+","+t.yCord+","+t.zCord);
}

如何在迭代器中获取对象 Tile 的实例?或者如果有更好的方法,请告诉我。

我试过用谷歌搜索这个,但我总是在寻找迭代纯数据的方法,比如字符串等,而不是类的实例化......

【问题讨论】:

  • 我假设您希望值之间有一些空间。例如试试 println 而不是 print。

标签: java iterator while-loop treemap


【解决方案1】:

字符串在 Java 中不是纯数据,它们是对象,所以是一样的:

Map map = new TreeMap();

Iterator itr = world.map.values().iterator();

while(itr.hasNext()){
    Tile t = (Tile)itr.next();
    System.out.print(t.xCord+","+t.yCord+","+t.zCord);
}

或者更好:

Map<Key, Tile> map = new TreeMap<Key, Tile>();

Iterator<Tile> itr = world.map.values().iterator();

while(itr.hasNext()){
    Tile t = itr.next();
    System.out.print(t.xCord+","+t.yCord+","+t.zCord);
}

甚至更好:

Map<Key, Tile> map = new TreeMap<Key, Tile>();

for(Tile t : map.values){
    System.out.print(t.xCord+","+t.yCord+","+t.zCord);
}

p.s Key 是您正在使用的关键对象的类

【讨论】:

  • 注意TreeMap有两个类型参数,key和value。
  • 我冒昧添加了Key ;)
【解决方案2】:
Tile t = (Tile) itr.next();

但请注意,使用迭代器,尤其是原始集合是一种非常过时的 Java 编写方式。使用类型化集合和增强的 for 循环会更好:

Map<String, Tile> map = new TreeMap<String, Tile>();

for(Tile t : map.values()){
     System.out.print(t.xCord+","+t.yCord+","+t.zCord);
}

【讨论】:

    【解决方案3】:

    itr.next() 给出下一个元素的实例,如javadocs 中所指定。请注意,由于您的 Map 是原始类型,因此您需要强制转换:Tile t = (Tile)itr.next();,但它不是类型安全的。

    更好的解决方案是使用 @Simone 建议的泛型

    【讨论】:

    • 一开始试过了,没用。我错过了一个选角。所以:Tile t = (Tile)itr.next();是正确的答案...但是无论如何...
    【解决方案4】:

    在你使用的迭代器中

    while(itr.hasNext()){
         Tile t = itr.next(); ...
    

    但是,除非您使用泛型指定类型,否则您还必须强制转换图块:

    Map<Whatever,Tile> map = new TreeMap<Whatever,Tile>();
    Iterator<Tile> itr = world.map.values().iterator();
    

    否则,迭代器值将不得不被强制转换 - 即你必须将你的示例(和上面的行)更正为

    while(itr.hasNext()){
             Tile t = (Tile)itr.next(); ...
    

    【讨论】:

      【解决方案5】:

      在循环中,使用itr.next()Iterator 中检索下一个Tile 对象。目前这将返回一个Object,因为您使用的是原始类型的TreeMap。而是使用TreeMap&lt;Key, Tile&gt;,这样值迭代器将是Iterator&lt;Tile&gt;

      【讨论】:

        【解决方案6】:

        Tile t = (Tile) itr.next()

        这将为您提供类的下一个实例,并将迭代器移动到下一个实例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 1970-01-01
          • 2014-08-18
          • 2020-03-05
          • 1970-01-01
          相关资源
          最近更新 更多