嵌套每个循环?

时间:2014-05-29 04:16:26

标签: java loops nested

        for ( Route r : timetable.keySet())
        {
            for (Station s: r?)   //compile error here.
        }

大家好,基本上我正在尝试编写一种方法,将工作站添加到组合框中 一个时间表。时间表本质上是一个返回Route,List(类型为服务)的hashmap, 并且路由由表示路由名称的字符串定义,并且

// a list of stations visited on this route 
private ArrayList<Station> stations;

基本上我需要访问路线中的电台,所以我使用foreach循环来获取时间表中的每条路线,然后尝试获取该路线中的所有电台,但是 我不确定如何进行第二个嵌套循环,因为我应该引用哪个列表 因为我在引用路线时遇到编译错误。

我无法修改Route类,因为已经提供了这个,我需要解决这个问题,但它确实有这种方法来返回站点

   public Station getStop(int i) {
    if (i < 1 || i > stations.size()) {
        throw new NoSuchStopException("No " + i + "th stop on route" + this);
    }
    return stations.get(i - 1);
}

5 个答案:

答案 0 :(得分:2)

您必须修改类Route并添加一个 getter 方法,该方法返回ArrayList(因为它是private):

public class Route {
    // ...

    public List<Station> getStations()
    {
        return stations;
    }
}

然后你可以在for循环中使用该方法:

for (Route r : timetable.keySet()) {
    for (Station s : r.getStations()) {
        // ...
    }   
}

编辑:正如@DavidWallace所提到的,如果您不希望有人通过getter方法修改ArrayList,您可以返回一个{{ 1}}:

unmodifiableList

答案 1 :(得分:1)

您可以通过以下方式获得解决方案,但它不会使用嵌套for-each循环,因为它需要捕获异常以了解何时不再有该路由的站点(此解决方案不需要对此路由进行任何更改)路线类):

for ( Route r : timetable.keySet())
{
    int stationIndex = 1;
    try {
        do {
            Station station = route.getStop(stationIndex++);
            // todo - put the station in the combo box
        } while(true);
    } catch(NoSuchStopException nsse) {
        // we have reached the index where there wasn't a stop, so move to the next route
    }
}

答案 2 :(得分:0)

您可以将其写为

for ( Route r : timetable.keySet()) {
    for (Station s: r.getStations()) {

        // ...

    }
}

如果Route类有类似

的方法
public List<Station> getStations() {
    return Collections.unmodifiableList(stations);
}

请注意unmodifiableList的使用。这可以防止有人编写调用getStations的代码,然后修改结果。基本上,应该不可能使用&#34; getter&#34;修改类的方法;因此使用各种&#34;不可修改的&#34; Collections类中的包装器方法是返回集合的getter的最佳实践。

修改

处理无法更改Route的新要求,并假设方法getNumberOfStops以及问题的getStop,您可以写

for (Route r : timetable.keySet()) {
    for (int stopNumber = 1; stopNumber <= r.getNumberOfStops(); stopNumber++) {
        Station s = r.getStop(stopNumber);
        // ...
    }
}

答案 3 :(得分:0)

for-each循环迭代集合或数组类型和Route对象r不是可迭代类型,这就是它引发编译器错误的原因。

for ( Route r : timetable.keySet()){
     for (Station s: r.getStations()){ // Get the station List from route object
       ...
     }   
}

注意:假设stations类中必须有Route的getter方法。

答案 4 :(得分:0)

每个循环的说明

for(XXX a : YYY)    
YYY --- > should be any class that implements iterable  
and XXX objects should be in YYY