我有一支舰队。舰队.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>();
}
答案 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
中的位置可能已更改,因此通常仅使用键来检索值。
请确保您已阅读上面我链接的官方文档。