为ArrayList创建一个add方法

时间:2013-04-29 15:48:38

标签: java if-statement methods for-loop arraylist

所以我应该为数组列表创建一个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循环,但我无法识别它。任何人都可以看到我可能做错的事吗?谢谢!

3 个答案:

答案 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声明也会略有变化。

请记住,我不知道你认为'相似'的是什么;只有当名字相似时才认为电影是相似的。

还有几条评论:

  1. 字段和方法名称通常以小写字母开头(因此字段Movie.Title应改为Movie.title)。
  2. 通常最好使用Collection而不是使用原始索引来遍历Iterator - 部分原因是Iterator应始终知道如何循环Collection有效率。
  3. 学习使用IDE的调试器(可能非常简单)。然后,您可以逐步执行每行代码,以确切了解程序执行意外操作的位置。

答案 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)

我正在解决你的“相似性”要求。如果你真的想要这样做,那可能需要做很多工作。基本上你有两个字符串,并想要衡量相似性。我正在为数字标题做同样的事情,我计划通过以下方式解决它:

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