为什么java在Spring框架中没有正确执行if-else语句?

时间:2018-02-10 18:12:04

标签: java spring

我试图通过按下按钮来为我的网络应用创建喜欢任何文章的可能性。所以这就是它的工作方式:你喜欢的东西,所以喜欢++,如果你喜欢它,它会删除你以前的喜欢,就像在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);
            }
        }
    }
}

2 个答案:

答案 0 :(得分: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&lt; String,User&gt;)和#containsKey(Object key)方法:boolean。无论您有10或200万条记录,您的访问时间都保持不变O(1) - 前提是您的字符串标识符保持唯一。

答案 1 :(得分:0)

答案:你的病情错了。

if(!user.getId().equals(users_liked.get(i).getId()))

如果用户中有十个用户喜欢列表。对于您检查的用户,将根据上述条件对其进行至少十次检查。每次获得一次,并将用户添加到列表中10次。

Input user: 11
(Before)User Like List: 
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Check 1 != 11, add 11 to the list.
Check 2 != 11, add 11 to the list.
...
Check 10 != 11, add 11 to the list.
Check 11 != 11, pass.
Check 11 != 11, pass.
...
Check 11 != 11, pass.

(After)User Like List:
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11]