在下面的代码中,我想使用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不起作用。
有关此的任何提示吗?
答案 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()方法。