2016-11-08 4 views
0

아래 코드에서 indexOf()을 사용하고 싶지만 적절한 방법을 찾을 수 없습니다.여러 객체가있는 ArrayList에 indexOf를 사용하십시오.

영화 클래스 :

public class Movie { 


    private String title; 
    private String genre; 
    private String actor; 
    private int yearPublished; 

    public Movie(String title, String genre, String actor, int yearPublished) { 
     this.title = title; 
     this.genre = genre; 
     this.actor = actor; 
     this.yearPublished = yearPublished; 
    } 

    @Override 
    public String toString() { 
     return title + ", Genre: " + genre + ", Actor(s):" + actor + ", Year of publishing: " + yearPublished; 
    } 



    public String getTitle() { 
     return title; 
    } 

    public String getGenre() { 
     return genre; 
    } 

    public String getActor() { 
     return actor; 
    } 

    public int getYearPublished() { 
     return yearPublished; 
    } 


} 

컨트롤러 클래스 :

The Matrix;action;Keanu Reeves;1999 

The Lord of the Rings;fantasy;Elijah Wood;2001 

Harry Potter;fantasy;Daniel Radcliffe;2001 

The Notebook;drama;Ryan Gosling;2004 

Step Up;drama, dance;Channing Tatum;2006 

Pulp Fiction;crime;Samuel L. Jackson, John Travolta;1994 

Star Wars: A New Hope;action;Mark Hamill;1977 

그래서 나는 주어진의 인덱스를 반환하고 싶습니다 :

public class Controller { 

    void start() { 
     scanning(); 
     printing("Movies:"); 
     selectYourMovie(); 

    } 

    private List<Movie> movies = new ArrayList<>(); 

    private void scanning() { 
     try { 
      Scanner fileScanner = new Scanner(new File("movies.txt")); 

      String row; 
      String []data; 

      while (fileScanner.hasNextLine()) {  
       row = fileScanner.nextLine(); 
       data = row.split(";"); 
       movies.add(new Movie(data[0], data[1], data[2], Integer.parseInt(data[3]))); 

      } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    private void printing(String cim) { 
     for (Movie movie : movies) { 
      System.out.println(movie); 
     } 
    } 

    private void selectYourMovie() { 

     System.out.println(movies.indexOf(/*What to put here?*/); 
    } 

} 

그리고 txt 파일의 내용 영화,하지만 난 여러 개체를 가진 목록으로 그것을하는 방법을 찾을 수 없습니다. txt의 전체 행을 전달하면 작동하지 않습니다.

어떤 힌트가 있습니까?

답변

2

물론 List#indexOf(T) 방법을 사용할 수 있습니다. 올바른 방법으로 수행하려면 동영상 객체에 Object#equals 메서드를 다시 구현하십시오. ArraysList 사용

3

메소드의 구현에 동일 같이 IndexOf

보기 :

public int indexOf(Object o) { 
     if (o == null) { 
      for (int i = 0; i < size; i++) 
       if (elementData[i]==null) 
        return i; 
     } else { 
      for (int i = 0; i < size; i++) 
       if (o.equals(elementData[i])) 
        return i; 
     } 
     return -1; 
    } 

그래서 영화 클래스는 완전히 그와 함께 작동 할 수 있도록 개발되지 ... :)

제대로 덮어 쓰기 (및 hashCode) 코드가 작동 할 수 있습니다!

0

나는 List#indexOf(Object) 방법을 잘못 사용하고 있다고 생각합니다.

List#indexOf(Object)

는이리스트를 지정된 요소의 첫번째 발생의 인덱스를 돌려리스트 요소를 포함하지 않는 경우.

표시되는 것처럼이 메서드는 하나의 매개 변수 인 Object을 사용하며 목록의 요소와 동일한 형식이어야합니다. Movie 유형의 객체를 저장하는 경우 다른 유형의 객체를 사용하면 항상 -1을 반환하므로 List#indexOf(Movie)을 사용해야합니다.

또한 개체를 목록에 추가 한 다음 다시 만들고 List#indexOf(Object)을 사용해야합니다.

Movie의 색인을 찾으려면 for()-loop을 사용하여 목록의 모든 개체를 반복하고 영화 이름이 지정한 이름과 같으면 (대소 문자를 구분하지 않음) 확인하십시오. 그럼 그냥 돌려 보내라. 너는 그것을 만들었다.

// EDIT : 물론 Movie 클래스에서 equals() 메서드를 재정의 할 수도 있습니다.

1

사용자 정의 개체 [즉, 무비]를 사용하면 equals() 및 hashCode() 메서드를 재정의하여 indexOf() 메서드가 지정된 Movies 객체가 List에서 사용할 수있는 기존 무비 객체와 동일한 지 식별 할 수 있습니다.

당신은이 게시물을 읽을 수 있습니다

이에 대해 더 알고 : Java: howto write equals() shorter 나는 아파치 라이브러리 commons-lang3

을 사용할 수 EqualsBuilder를 사용하는 것이 좋습니다