Java проблема итерации по древовидной коллекции классов - PullRequest
0 голосов
/ 05 сентября 2011

Я пытаюсь перебрать Treemap класса Tile (), используя:

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 внутри итератора? Или, если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Я пытался погуглить, но я всегда заканчиваю поиском способов перебора чистых данных, таких как строки и т. Д., А не экземпляров класса '...

Ответы [ 6 ]

2 голосов
/ 05 сентября 2011

Строки не являются чистыми данными в 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 - это класс ключевых объектов, которые вы используете

2 голосов
/ 05 сентября 2011
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);
}
1 голос
/ 05 сентября 2011

itr.next() дает экземпляр следующего элемента, как указано в javadocs .Обратите внимание, что, поскольку ваша карта имеет сырой тип, вам понадобится приведение: Tile t = (Tile)itr.next();, но оно НЕ является безопасным для типа.

Еще лучшее решение - использовать дженерики, как предложено @Simone

0 голосов
/ 05 сентября 2011

Tile t = (Tile) itr.next()

Это даст вам следующий экземпляр класса, а также переместит итератор к следующему экземпляру.

0 голосов
/ 05 сентября 2011

В цикле используйте itr.next(), чтобы получить следующий Tile объект из Iterator.В настоящее время это вернет Object, так как вы используете TreeMap в необработанном виде.Вместо этого используйте TreeMap<Key, Tile>, чтобы итератор значений был Iterator<Tile>.

0 голосов
/ 05 сентября 2011

В итераторе, который вы используете

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(); ...
...