java选择对象的实例

时间:2018-09-13 15:44:40

标签: java object input java.util.scanner

我有一支舰队。舰队.java

每个舰队都有一套船。 ship.java

每艘船都有一组乘员组。 crewmember.java

在Main之内,我要向舰队添加Ships,向船上添加Crewmembers,从两者的花名册中读取。

从第一个文件中,我将一个新的飞船添加到arraylist中。 从第二个文件中,我向阵列列表添加了一个新的乘员组。

this.addships(ship)

this.shipname.addcrewmember(crewmember)

如何根据输入文件中的令牌更改上述声明中的船名?

public void loadStarships( String filename ) {
    File file = new File( filename );
    Scanner scan;

    try {
        scan = new Scanner( file );

        while( scan.hasNextLine() ) {
            String line = scan.nextLine();
            String[] tokens = line.split(",");
            Starship star = null;

            star = new Starship( tokens[0], tokens[1], tokens[2]);

            this.addStarship( star );
        }

        scan.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void loadCrew( String filename ) {
    File file = new File( filename );
    Scanner scan;
    try {
        scan = new Scanner( file );

        while( scan.hasNextLine() ) {
            String line = scan.nextLine();
            String[] tokens = line.split(",");
            CrewMember member = null;

            member = new CrewMember( tokens[0], tokens[1], tokens[2], tokens[4]);

            this.tokens[3].addCrewMember( member );
        }

        scan.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public Starship( String name, String registry, String level) {
    this.name = name;
    this.registry = registry;
    this.level = level;
    this.crewmembers = new ArrayList<CrewMember>();
}

//adds new crew members
public void addCrewMember( CrewMember crewmembers ) {
    this.crewmembers.add( crewmembers );
    this.numberOfCrewMembers++;
}

public CrewMember( String name, String position, String rank, String species ) {
    this.name = name;
    this.position = position;
    this.rank = rank;
    this.species = species;
}
//set the fleet name and the maximum number of starships
public Fleet(String name) {
    this.name = name;
    this.starships = new ArrayList<Starship>();
}

1 个答案:

答案 0 :(得分:0)

软件设计的第一条规则是“为工作使用正确的数据结构”。就目前而言,您是将ship实例保存到ArrayList中,该实例仅允许您按索引检索元素。

尽管您没有提供所请求的样本数据,但很容易推断出token[3]是船员所属的船名,因此您需要弄清楚如何通过名称。

幸运的是,Java为您提供了HashMap,用于存储键值对。您可以使用船名作为密钥。当您将该键传递给HashMap时,它将返回与该键关联的值-在您的情况下,是您需要的ship实例。

1)确保您的课程导入了java.util.HashMap;

2)声明您的HashMap。代替:

ArrayList<Starship> ships = new ArrayList<Starship>();

使用:

HashMap<String, Starship> = new HashMap<String, Starship>();

在这种情况下,代表船名的字符串是关键。具有该名称的ship实例就是值。

3)添加新飞船时,除了已经需要的Starship arg之外,还必须更新addStarship()方法以获取String arg:

public void addStarship(String name, Starship ship)

4)在addStarship()的正文中,您必须使用put()方法添加飞船:

ships.put(name, ship);

请记住,这里的ships是您用来存储船只的HashMap的实例。 name是代表飞船名称的字符串,而ship是飞船对象。

5)尝试取回船只时,请使用get()方法:

ships.get(name);

在您的情况下,代码可能如下所示:

ships.get(tokens[3].addCrewMember(member));

请记住,使用HashMap不再像使用ArrayList那样按索引检索值。 HashMap是按定义的无序集合,这意味着结构的第一个元素可能是也可能不是您添加的第一个对象,即使您在第一个位置访问了一个对象,也无法保证它是如果您稍后尝试访问它,它将仍然位于该插槽中-它在HashMap中的位置可能已更改,因此通常仅使用键来检索值。

请确保您已阅读上面我链接的官方文档。