2017-05-05 3 views
2

큰 문제가 있습니다. FileRelationship이라는 클래스가 있는데, 두 개의 생성자가 있습니다. 클래스는 아래와 같습니다. 나는 또한이 클래스에서 equals 메소드를 오버라이드했다. 이제안드로이드 검색 하나의 매개 변수에 대한 객체의 ArrayList 객체의 색인을 반환합니다.

public class FileRelationship { 
String fileName; 
String firstLink; 
String secondLink; 
String thirdLink; 

public FileRelationship(String fileName) { 
    this.fileName = fileName; 
} 

public FileRelationship(String fileName, String firstLink, String secondLink, String thirdLink) { 
    this.fileName = fileName; 
    this.firstLink = firstLink; 
    this.secondLink = secondLink; 
    this.thirdLink = thirdLink; 
} 

public boolean equals(Object o) { 
    if(o == null) { 
     return false; 
    } 

    if(this == o) { 
     return true; 
    } 

    if(o instanceof FileRelationship) { 
     return this.fileName.equals(((FileRelationship)o).fileName); 
    } 

    return false; 
} 

}

나는 FileRelationships의 ArrayList를이 나는이 모두가 (4 개 문자열로 생성자를 사용하여 (이 목록을 검색 할 수있는 파일 이름, firstLink, secondLink, thirdLink)) 이제이 arrayList를 검색해야하는 다른 클래스의 메서드가 있는데이 메서드는 fileName이 일치하는 인덱스를 찾습니다. 이 메서드를 호출하면 fileName을 사용하여 생성자에 전달하는 것으로 끝납니다. (이것은 내가 할 수있는 유일한 방법이며 다른 문자열은 알 수 없다).

이것은 FileRelationships의 ArrayList를 설정하는 방법입니다.

 fileRelationships = new ArrayList<FileRelationship>(); 

    String MasterLine; 

    InputStream inputStream = this.getResources().openRawResource(R.raw.masterfile); 

    InputStreamReader inputreader = new InputStreamReader(inputStream); 
    BufferedReader buffreader = new BufferedReader(inputreader); 

    // Creates the arrayList of all the relationships for later use of retreival. 
    try { 
     while ((MasterLine = buffreader.readLine()) != null) { 
      MasterLineArray = MasterLine.split(","); 
      String filename = MasterLineArray[0]; 
      String choice1 = MasterLineArray[1]; 
      String choice2 = MasterLineArray[2]; 
      String choice3 = MasterLineArray[3]; 
      FileRelationship fr = new FileRelationship(filename, choice1, choice2, choice3); 

      fileRelationships.add(fr); 
     } 
    } catch (IOException e) { 

    } finally { 
     closeQuietly(buffreader); 
} 

이것은 관계를 찾고 필요한 변수로 설정하는 나의 방법입니다. 목록의 색인을 찾아 변수에 적용 할 수 있기를 원합니다.

 public void findRelationship(String nextFileName) { 
     int pageIndex = fileRelationships.indexOf((new FileRelationship(nextFileName))); 
     selectedRelationship = fileRelationships.get(pageIndex); 
     currentPage = pageIndex; 
    } 

편집 : 죄송합니다. 무엇이 잘못 되었습니까? 아니, 작동하지 않습니다. pageIndex는 -1을 반환합니다 (즉, 아무것도 찾지 못했습니다). 그 밖의 무엇을해야할지 모르겠다. 어쩌면 HashCode를 사용할 수도있다. 솔직히 나는 그것에 관해서도 살펴 보았고, 나는 그것을 사용하는 방법을 정말로 알 수 없다.

학교 프로젝트가 곧 끝나기 때문에 정말 도움이 필요합니다. 이 프로젝트가 끝나면 거의 완료해야합니다. 감사. 이

public void findRelationship(String nextFileName) { 

for(FileRelationship file:fileRelationships) 
{ 
    if(file.firsFileName.equals(nextFileName)) 
    { 
    currentPage=fileRelationships.indexOf(file); 
    } 
} 

} 

목록 같은

+1

이 코드의 문제는 무엇인가되지 않은 각 필드에 접근 FileRelationship 클래스의 각 필드에 대한 게터 세터 방법을? 그것은 작동하지 않습니까? – Eran

+0

나는 당신이 어떤 수정을하고 싶지 않다면리스트를 검색하거나 단지 foreach 루프를 사용하기 위해 Iterator를 사용해야한다고 생각한다. 귀하의 경우 pageIndex 값이 -1이라고 생각합니다. 내가 맞습니까? – FaisalAhmed

+0

FileRelationship (String, String, String String)과 FileRelationship (String)을 비교하려고했기 때문에 그렇게해야만한다고 생각했습니다. 예, 내 pageIndex는 -1이며 이것이 문제입니다. 색인을 반환하는 데 도움이 될까요? –

답변

2

검색은 -1을 반환 목록에 해당 개체를 포함하지 않는 경우. 귀하의 경우에 새로운 객체를 생성하여 indexOf() obj를 어디에 사용하는지

int pageIndex = fileRelationships.indexOf((new FileRelationship(nextFileName))); 

이것은 올바른 방법이 아닙니다. 새로운 객체와 목록을 작성하기 때문에하지 않습니다 새로운 객체

포함하고 또한 직접 좋은 방법