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