所以我应该为数组列表创建一个add方法,如果它不存在则将新的电影对象添加到列表中,或者如果它在列表中找到具有类似标题的电影对象,它只会增加数量该物体的财产。这是我到目前为止所做的。
public void add(String title, double rating, int releaseYear){
if(this.myMovies.size() < 1)
{
Movie mymovie = new Movie(title, rating, releaseYear);
this.myMovies.add(mymovie);
}
else
{
for(int i = 0; i < this.myMovies.size(); i++)
{
Movie temp = this.myMovies.get(i);
if(temp.Title.equals(title)){
this.myMovies.get(i).quantity++;
break;
}
else
{
Movie mymovie = new Movie(title, rating, releaseYear);
this.myMovies.add(mymovie);
break;
}
}
}
}
我的问题是,这最终没有考虑类似的名称,也没有增加数量,只是在列表中添加了另一个对象。我有一种强烈的感觉,问题在于我的For循环,但我无法识别它。任何人都可以看到我可能做错的事吗?谢谢!
答案 0 :(得分:1)
你只测试相等,而不是相似之处:
if(temp.Title.equals(title)){
相反,您应该编写一个辅助方法来根据适当的标准测试相似性。例如:
if (isSimilar(temp.Title, title)){
并且isSimilar方法可能看起来像这样(假设您不需要任何输入验证):
private void isSimilar(String title1, String title2) {
return title1.equalsIgnoreCase(title2)
|| title1.toLowerCase().contains(title2.toLowerCase())
|| title2.toLowerCase().contains(title1.toLowerCase());
}
或者,或许更合适,像这样(如果你在Movie类中实现它):
private void isSimilar(otherMovie) {
return title.equalsIgnoreCase(otherMovie.title)
|| title.toLowerCase().contains(otherMovie.title.toLowerCase())
|| otherMovie.title.toLowerCase().contains(title.toLowerCase());
}
...在这种情况下,您的if
声明也会略有变化。
请记住,我不知道你认为'相似'的是什么;只有当名字相似时才认为电影是相似的。
还有几条评论:
Movie.Title
应改为Movie.title
)。Collection
而不是使用原始索引来遍历Iterator
- 部分原因是Iterator
应始终知道如何循环Collection
有效率。答案 1 :(得分:1)
我会做这样的事情:
public void add(String title, double rating, int releaseYear){
for(Movie m: myMovies.size())
{
if(m.Title.equals(title)){
m.quantity++;
return;
}
}
// movie with same title not found in the list -> insert
this.myMovies.add(new Movie(title, rating, releaseYear));
}
顺便说一句:变量名称应以小写字符(Title
- &gt; title
)开头。
答案 2 :(得分:0)
我正在解决你的“相似性”要求。如果你真的想要这样做,那可能需要做很多工作。基本上你有两个字符串,并想要衡量相似性。我正在为数字标题做同样的事情,我计划通过以下方式解决它:
基于简单的单词计数,这将有很长的路要走。但是你有堵塞的问题 (不同于结尾的词 - “外星人”和“外星人”)。如果你走这条路,你需要阅读有关分类和自然语言处理的信息