2017-12-13 4 views
-2

私は学校のためのassingmentを持って、私はいくつかのArrayListに問題があります。私はすべての行に1つのエントリを持つ入力ファイルを持っています。このエントリは、整数と最大4つの文字列を持ちます。この入力ファイルは、フィルムが撮影された場所に関するものです。整数は私の場合のmovieIDで、文字列は場所です。しかし、すべての映画に4つの場所があるわけではありません。つまり、私のプログラムがファイルを読み込もうとするとエラーが返されます。なぜなら、すべての行に5つのフィールドが必要だからです。私はいくつかの異なるファイルを読み込まなければならないので、データローダークラスを使用します。私の他のファイルは、各行に特定の数の項目とフィールドを持っているので、それらをロードすることは問題ではありません。ロード処理は、ファイルを配列リストに追加し、必要なオブジェクトを作成することによって実行されます。私は何とか空のフィールドを理解し、動的にそれらを扱うプログラムを必要としていることを知っています。例えば、映画は3つの場所を持つので、4番目のフィールドは空ですが、まだわかりません。助言がありますか?ありがとうございました!動的なArrayListのフィールド

これは私の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; 
     } 
    } 

そして、これは私の場所のクラスである:あなたがここに

String[] tokens = new String[numFields]; 
for (int i = 0; i < numFields; i++) { 
    tokens[i] = tokenizer.nextToken(); 
} 

を配列を埋める

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

なぜ 'fullDataLoad'関数を1行に圧縮したのですか? 'movieLoader'はどのような種類のオブジェクトですか? – Michael

+1

入力ファイルの行を1つのString変数で読み込み、splitを適用してarrayList内の値を読み取ろうとします。 –

+0

@Michaelが編集を確認してください。私はコードを再アップロードしました。 – hristoforidisc

答えて

1

が、配列は長さが固定されている、あなたが持つことができる場合、それらを使用する理由は本当にありませんより少ない値。代わりにリストを記入してください。

List<String> tokens = new ArrayList<>(); 
while (tokenizer.hasNextToken()) { 
    String token = tokenizer.nextToken().trim(); 
    if (!token.isEmpty()) { 
     tokens.add(tokenizer.nextToken()); 
    } 
} 

実際、私は読者に予想されるトークンの数を何とか与える必要があるのか​​どうかはわかりません。

でも怪しいが指摘したように、あなたにも文字列#分割を使用する場合があります:だけでなく、空の文字列が得られますが、あなたは自分のconstructObjectFromRow機能でそれらを無視することができます

String[] tokens = line.split(delimiter); 

+0

String.split()を使用すると、(Listではなく)可変サイズの配列を使用し続けることができます。 – DodgyCodeException

+0

@ DodgyCodeException合意しました。私の答えに追加されました。 – daniu

+0

さて、あなたが言うことを見るが、今は混乱している。このコードは、私が期待する適切なフィールドを与えればうまく動作します。私はどのように "トークン"配列を分割するつもりですか?コードのどの部分に? @daniu – hristoforidisc

関連する問題