我正在尝试通过按赞按钮为我的网络应用创建喜欢任何文章的可能性。这就是它的工作方式:您喜欢某事,喜欢某事++,如果再次喜欢,它会删除您以前的某事,就像在YouTube上一样,您将无法获得无限的赞誉。但是它不能正常工作。当我已经在喜欢这篇文章的数组中时,它会再次写信给我,并进行计数器更新。但是我用阵列中的用户检查每个用户。怎么了?谢谢

public void likeProject(User user)
{
    if(users_liked.size() == 0) // If the are no users who liked this article, write this user
    {
        users_liked.add(user);
        setLikes(getLikes() + 1);
    }

    else // This is for array, which already has users who pressed like button
    {
        for(int i = 0; i < users_liked.size(); i++)
        {
            if(!user.getId().equals(users_liked.get(i).getId())) // i liked it before, so my object is in an array, so this shouldn't be executed
            {
                users_liked.add(user); // Idk why, but this it's executes every time i press the like button. I'm already in an array
                setLikes(getLikes() + 1);
            }
        }
    }
}

最佳答案

EI CHO已指出问题所在。在我的回答中,我想提出一个代码更正;您可以这样做:

// ...
else {
    int i = 0;
    for(; i < users_liked.size(); i++) {
        if(!user.getId().equals(users_liked.get(i).getId())) {
            continue;
        } else {
            // user found! unlike and process etc. etc.
            break;
        }
    }
    if (i == users_liked.size()) {
        // After traversing the array we didn't find the specified user
        // Add user to list and process likes
        users_liked.add(user);
        setLikes(getLikes() + 1);
    }
}
// ... etc. etc.


干杯!

编辑

要增强我的答案和访问时间:如您所见,如果您使用数组作为数据结构来存储User对象,则始终必须遍历整个数组以确保您要查找的User对象不在其中数组。因此,您始终必须迭代n次,即您的访问时间为O(n)(具有n条记录)

为了增加访问时间,请使用哈希映射(HashMap )和方法#containsKey(Object key):boolean代替。不管您有10或200万条记录,只要您的String标识符保持唯一,访问时间就保持O(1)不变。

07-24 21:52