0

我正在学习斯坦福大学的 CS106A 课程,其中一项任务是建立一个特定城市之间可用航班的数据库。我为一个城市编写了一个类,但addDestination第一次调用该方法有效,当添加第二个目的地时,ArrayList最终为空。为什么?这个真让我着迷。

import java.util.*;
    //class for a city. destinations are stored in an ArrayList
public class City {

    //Constructor
public City(String name){
    CityName = name;
}

//returns the name of the city
public String getName(){
    return CityName;
}
    // takes in a destination and adds it to the ArrayList unless
    //the destination already exists in which case it returns false.
public boolean addDestination(String destination){
    if (destinations.indexOf(destination)==-1){
        destinations.add(destination);
        return true;
    }
    else return false;
}

public Iterator<String> destIter(){
    Iterator<String> it =destinations.iterator();
    return it;
}

private ArrayList<String> destinations = new ArrayList<String>();
private String CityName;
}

这是创建城市数据库的代码。hm是一个HashMap,它读取一个 txt 文件,其中每一行类似于“旧金山 - >纽约”

BufferedReader rd = new BufferedReader(new FileReader(FileName));
     String line = "";
     while (line!=null){
        if (line.indexOf("->")!=-1){
            String From = line.substring(0, line.indexOf("->")-1);
            String To = line.substring(line.indexOf('>')+2);
            City city = new City(From);
            if (hm.containsKey(From)==false)hm.put(From, city);
            hm.get(From).addDestination(To);

        }   
        line = rd.readLine();
    }
4

3 回答 3

0

城市包含目的地?我认为这一切发生的原因是private ArrayList<String> destinations = new ArrayList<String>,你为城市实例创建了一个成员,而不是城市类,所以这意味着每个实例都有一个数组列表,但你只需要一个数组列表就可以将所有目的地放在一起,它是空的,因为这是您创建的第二个城市的数组

更具体地说,我需要看看你的主要方法来确定它是否真的如此。

于 2012-06-14T19:30:33.183 回答
0

除了将实例变量放在顶部之外,您的代码对我有用。

于 2012-06-14T20:57:57.853 回答
0

我不确定为什么您的城市目的地列表是空的。我调试了你的逐字代码,它对我有用。

仔细检查以确保您检查的不是来自 的目的地city,而是 hm.get(From)。如果您已经找到了一个城市,那么您正在创建一个您最终不会再次提及的城市。

一个更有效的while-block 可能如下所示:

while (line != null) {
    if (line.indexOf("->") != -1) {
        String From = line.substring(0, line.indexOf("->")-1);
        String To = line.substring(line.indexOf('>')+2);

        if (! hm.containsKey(From)) {
            hm.put(From, new City(From));
        }
        hm.get(From).addDestination(To);
    }
}
于 2012-06-14T21:01:53.683 回答