2016-11-08 19 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; 
    } 


} 

控制器类:

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文件的内容:

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 

所以我想返回给定的指标电影,但我找不到如何使用具有多个对象的列表来完成它。由于传递整行txt不起作用。

对此有何暗示?

回答

2

您当然可以使用List#indexOf(T)方法。要以正确的方式执行此操作,请在您的电影对象中重新实施Object#equals方法。

3

ArraysList使用等于在方法的实现的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; 
    } 

所以你的电影类没有完全发展到能与工作... :)

重写正确equals(和hashCode),所以代码可以工作!

0

我相信你使用的是List#indexOf(Object)方法不对。

List#indexOf(Object)

返回指定元件的第一次出现的索引在此 列表,或者-1,如果该列表中不包含的元素。

如您所见,该方法采用一个参数Object,该参数必须与列表中的元素类型相同。如果您存储Movie类型的对象,则必须使用List#indexOf(Movie),因为如果使用不同类型的对象,它将始终返回-1。

您还需要确保不要将对象添加到列表中,然后再次创建它,然后使用List#indexOf(Object)

如果您想通过名称查找Movie的索引,只需使用for()-loop来遍历列表中的所有对象,并检查电影的名称是否等于(忽略区分大小写)给定的名称。然后就把它还给你,你做到了。

//编辑: 你当然也可以重写Movie类中的equals()方法。

1

因为您正在使用自定义对象[即电影],您可能想要重写equals()和hashCode()方法,以便indexOf()方法可以识别给定的Movies对象是否与List中可用的任何现有Movies对象相同。

你可以阅读这篇文章,以了解更多信息:Java: howto write equals() shorter

我会建议在Apache的图书馆commons-lang3

使用 EqualsBuilder可用