将indexOf与具有多个对象的ArrayList一起使用

时间:2016-11-08 20:03:42

标签: java arraylist indexof

在下面的代码中,我想使用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不起作用。

有关此的任何提示吗?

4 个答案:

答案 0 :(得分:3)

ArraysList在方法 indexOf

的实现中使用equals

外观:

 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),以便代码可以正常工作!

答案 1 :(得分:2)

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

答案 2 :(得分:1)

因为您使用的是自定义对象[即您可能希望覆盖其equals()和hashCode()方法,因此indexOf()方法可以识别给定的Movies对象是否与List中可用的任何现有Movies对象相同。

您可以阅读此帖子以了解有关Java: howto write equals() shorter

的更多信息

我建议使用Apache的库EqualsBuilder中提供的commons-lang3

答案 3 :(得分:0)

我相信您使用List#indexOf(Object)方法错误。

List#indexOf(Object)

  

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

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

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

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

//编辑: 您当然可以覆盖Movie类中的equals()方法。