我对学校有所帮助,我遇到了一些ArrayLists问题。我有一个输入文件,每行都有一个条目。此条目有一个整数和最多四个字符串。此输入文件是关于拍摄电影的位置。在我的情况下,整数是movieID,字符串是位置。然而,并非每部电影都有4个位置,这意味着当我的程序尝试加载文件时,它会返回一个错误,因为它预计每行有5个字段,这种情况从未发生,因为我有1或2个电影或位置。我使用数据加载器类,因为我必须加载几个不同的文件。我的其他文件在每行都有特定数量的条目和字段,因此加载这些文件并不是问题。通过将文件添加到数组列表然后创建所需对象来完成加载过程。我知道我需要程序以某种方式理解空字段并且可能动态处理它们,例如电影有3个位置所以第4个字段是空的,但我还没想到它。有什么建议?谢谢!
这是我的LocationsLoader类。
package dataLoader;
import java.util.ArrayList;
import dataModel.Locations;
public class LocationsLoader extends AbstractFileLoader<Locations>{
public int constructObjectFromRow(String[] tokens, ArrayList<Locations> locations) {
int movieID;
List<String> loc = new List();
movieID = Integer.parseInt(tokens[0]);
loc = tokens[]; // What goes here?
Locations l;
l = new Locations(movieID, loc);
locations.add(l);
System.out.println(l);
//System.out.println(locations.toString());
return 0;
}
}
这是我的Locations课程:
package dataModel;
public class Locations {
private int movieID;
private List<String> loc;
public Locations(int otherMovieID, List<String> otherLocations) {
this.movieID = otherMovieID;
this.loc = otherLocations;
}
public int getMovieID() {
return movieID;
}
public void setMovieID(int id) {
this.movieID = id;
}
public String getLocations(int index) {
return loc.get(index);
}
}
}
答案 0 :(得分:1)
你在这里填充数组
String[] tokens = new String[numFields];
for (int i = 0; i < numFields; i++) {
tokens[i] = tokenizer.nextToken();
}
但是数组是固定长度的,如果你可以有更少的值,就没有理由使用它们。填写一个列表。
List<String> tokens = new ArrayList<>();
while (tokenizer.hasNextToken()) {
String token = tokenizer.nextToken().trim();
if (!token.isEmpty()) {
tokens.add(tokenizer.nextToken());
}
}
事实上,我不确定为什么你需要向读者提供预期令牌的数量。
但正如Dodgy指出的那样,你也可以使用String#split:
String[] tokens = line.split(delimiter);
也会产生空字符串,但您可以忽略constructObjectFromRow
函数中的字符串。