2015-04-07 4 views
0

Прежде всего, и для того, чтобы понять этот вопрос, я собираюсь кратко объяснить мой проект:Проблем с итератором в Java

У меня есть класс с именем Pair, который в основном создает тип

Pair<String,Double> 

и имеет getFirst() и getSecond() методы для возврата значений String и Double соответственно.

Тогда у меня есть еще один класс, названный Package, который в основном состоит в списке Pairs и реализует интерфейс Iterable, так что я могу перебирать корыта список:

Package<Pair<String,Double>> package; 
List <Pair<String,Double>> list; 

Что я хочу, чтобы sum в doubles на каждом Pair, используя iterator().

итератора определяется как это для Package класса:

public Iterator<E> iterator() { 

     return this.iterator(); 
    } 

Я попытался два различных подхода, которые в обоих случаях результатом в:

Exception in thread "main" java.lang.StackOverflowError 
    at Package.iterator(Package.java:98) 

Вот первый один:

public static double packageWeight(Package<Pair<String, Double>> package) { 

    double sum = 0; 
    Pair<String, Double> pair; 

    while (package.iterator().hasNext()) { 

     pair = package.iterator().next(); 
     sum = sum + pair.getSecond(); 

    } 

    return sum; 
} 

И второй один:

public static double packageWeight(Package<Pair<String, Double>> package) { 

    double sum = 0; 
    Pair<String, Double> pair; 

    Iterator<Pair<String,Double>> it = Package.iterator(); 

    while (it.hasNext()) { 

     pair = it.next(); 
     sum = sum + pair.getSecond(); 

    } 

    return sum; 
} 

Мой вопрос: Что я делаю неправильно, чтобы получить эту ошибку?

+0

Можете ли вы разместить остальную часть своего кода? –

+0

Кроме того, вам не нужно передавать итератору объект для перебора? В методе packageWeight ... – holtc

+2

У вас не может быть переменной, называемой 'package', верно? Это ключевое слово java. –

ответ

5

Непосредственной причиной StackOverflowError является то, что вы вызываете метод в себя:

public Iterator<E> iterator() { 

     return this.iterator(); 
    } 

Вам нужно вызвать другой метод здесь, например, return list.iterator() или package.iterator() (за исключением того, что package не является допустимым идентификатором в Java, поскольку это ключевое слово).

+0

да! Действительно, проблема была решена с использованием моего второго подхода и изменения статуса возврата на 'list.iterator()', спасибо! – laker001

+0

о проблеме 'package.iterator()', я просто перевел вопрос на английский, и оказалось, что у меня была проблема! оригинальное имя отличается – laker001

2

Ваша первая попытка ошибочна, потому что вы запрашиваете новый итератор каждый раз, когда вы звоните package.iterator() - Я думаю, вы знали это, потому что тогда вы написали второй.

Ошибка со вторым более тонкая - вам необходимо использовать package.iterator() не Package.iterator(). Второй не должен работать.

И что такое Andy Turner.

Смежные вопросы