动态ArrayList字段

时间:2017-12-13 09:33:48

标签: java arraylist

我对学校有所帮助,我遇到了一些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);
        }
     }
  }    

1 个答案:

答案 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函数中的字符串。