2017-12-13 1 views
-2

학교에 대한 약속이 있고 일부 ArrayList에 문제가 있습니다. 모든 줄마다 하나의 항목이있는 입력 파일이 있습니다. 이 항목에는 정수와 최대 네 개의 문자열이 있습니다. 이 입력 파일은 필름이 촬영 된 위치에 관한 파일입니다. 정수는 내 경우에는 movieID이고 문자열은 위치입니다. 그러나 모든 영화가 4 개 위치를 가지고있는 것은 아닙니다. 즉, 내 프로그램이 파일을로드하려고 할 때 모든 행에 5 개의 입력란이 필요하기 때문에 오류가 발생하며 1 또는 2 또는 위치가있는 영화가 있기 때문에 절대 발생하지 않습니다. 여러 파일을로드해야하기 때문에 데이터 로더 클래스를 사용합니다. 내 다른 파일에는 각 행에 특정 수의 항목과 필드가 있으므로로드하는 것은 문제가되지 않습니다. 로드 프로세스는 파일을 배열 목록에 추가 한 다음 필요한 개체를 만드는 방식으로 수행됩니다. 빈 필드를 이해하고 동적으로 처리 할 수있는 프로그램이 필요하다는 것을 알고 있습니다. 예를 들어 동영상에 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' 함수가 한 줄로 압축 되었습니까? 'movieLoader'는 어떤 종류의 객체입니까? – Michael

+1

하나의 String 변수에서 입력 파일의 행을 읽은 다음 split을 적용하여 arrayList의 값을 읽으려고합니다. –

+0

@Michael이 편집을 확인하십시오. 방금 코드를 reuploaded. – hristoforidisc

답변

1

, 당신이 할 수있는 경우이를 사용하는 이유는 정말 없다 더 적은 값. 대신 목록을 채 웁니다.

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

사실 나는 왜 독자에게 예상 토큰의 수를 줄 필요가 있는지 확신 할 수 없습니다.

그러나 사기가 지적했듯이, 당신은뿐만 아니라 문자열 # 분할 사용할 수 있습니다뿐만 아니라 빈 문자열을 얻을 것입니다

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

, 그러나 당신이 당신 constructObjectFromRow 기능 사람들을 무시할 수 있습니다.

+0

String.split()을 사용하면 목록 대신 배열을 계속 사용할 수 있지만 크기는 가변적입니다. – DodgyCodeException

+0

@DodgyCodeException 합의 됨. 내 대답에 추가되었습니다. – daniu

+0

좋아, 네가하는 말을 보지만 지금은 혼란 스럽다. 내가 가지고있는이 코드는 올바른 필드를 제공하면 잘 작동합니다. "토큰"배열을 어떻게 분할할까요? 코드의 어느 부분에 있습니까? @daniu – hristoforidisc