1

所以我应该为一个数组列表创建一个 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 循环中,但我无法识别它。谁能看到我可能做错了什么?谢谢!

4

3 回答 3

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陈述也会略有变化。

请记住,我不知道您认为“相似”是什么;只是如果名称相似,则认为电影相似。

还有一些评论:

  1. 字段和方法名称通常以小写字母开头(因此字段Movie.Title应改为Movie.title)。
  2. 通常最好Collection使用 anIterator而不是使用原始索引来循环 a ——部分原因是Iterator应该始终知道如何Collection有效地循环。
  3. 学习使用 IDE 的调试器(这可能很容易)。然后,您可以单步执行每一行代码,以准确查看您的程序在哪里执行了意想不到的操作。
于 2013-04-29T15:55:44.563 回答
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-> title)开头。

于 2013-04-29T15:55:56.930 回答
0

我正在解决您的“相似性”要求。如果您真的想正确执行此操作,可能需要做很多工作。本质上,您有两个字符串,并且想要衡量相似性。我正在为图形标题做同样的事情,我计划通过以下方式解决它:

基于简单的字数统计,这将有很长的路要走。但是你有词干的问题(词尾不同 - “外星人”和“外星人”)。如果你走这条路,你需要阅读分类和自然语言处理

于 2013-04-29T16:33:07.647 回答