Я написал программу для сайта загрузки фотографий, где пользователи могут лайкать фотографии, у меня есть тестовый скрипт, чтобы лайкнуть фотографию, а затем отобразить все лайки, затем я хочу удалить лайки и отобразить все лайки сейчас. Как мне это сделать?
import java.util.*;
public class Likes {
private static Hashtable<Photo, TreeSet<User>> likes = new Hashtable<>();
//like photo
public static void like(Photo photo, User user) {
try {
likes.get(photo).add(user);
}
catch (NullPointerException e) {
likes.put(photo, new TreeSet<>());
likes.get(photo).add(user);
}
}
//unlike photo
public static void unlike(Photo photo, User user) {
try {
likes.get(photo.remove(user));
}
catch (NullPointerException e) {
}
}
//has liked photo
public boolean hasliked(Photo photo, User user) {
try {
return likes.get(photo).contains(user);
}
catch (NullPointerException e) {
return false;
}
}
//get all likes
public List<Photo> getAllLikes(User user){
// new empty list
List<Photo> likedphotos = new ArrayList<Photo>();
for (Photo photo : likes.keySet()) {
if (hasliked(photo, user)){
// add photo to list
likedphotos.add(photo);
}
// return that initial list
}
return likedphotos;
}
public String toString() {
return likes.toString();
}
public void get(Photo remove) {
}
public void remove(Photo photo1, User user1) {
}
}
Тесты:
import java.sql.SQLOutput;
import java.util.*;
public class TestDrive {
public static void main(String[] args) throws InputValidationException {
//create 2 photo object
Photo photo1 = new Photo();
Photo photo2 = new Photo();
//create 1 user object
User user1 = new User();
//create 1 like object
Likes likes1 = new Likes();
//set 2 photos
photo1.setimageURL("photo of user 2");
photo2.setimageURL("photo of user 1");
//print the 2 photos
System.out.println(photo1.getimageURL());
System.out.println(photo2.getimageURL());
//set 1 user
user1.setUserName("oopnoob");
//print the username
System.out.println(user1.getUserName());
//Like the 2 photos
Likes.like(photo1, user1);
Likes.like(photo2, user1);
//Test the hasliked method to see if user1 has liked both photos - both should return true
System.out.println("Should be true: " + likes1.hasliked(photo1, user1));
System.out.println("Should be true: " + likes1.hasliked(photo2, user1));
//Test the getAllLikes for user1. Should print 2 photos.
System.out.println("user1 liked: " + likes1.getAllLikes(user1));
//i dont know how to remove the like from the photo
//Test the unlike feature by unliking photo1
likes1.unlike(photo1, user1);
//Test the getAllLikes - should only print one photo
System.out.println("user1 liked: " + likes1.getAllLikes(user1));
}
}
Не связано: используйте вертикальный интервал (пустые строки) с намерение. Не просто бросайте пустые строки здесь и там. Используйте их, чтобы сгруппировать вещи, которые принадлежат друг другу. Не оставляйте 5 пустых строк в середине вашего кода без всякой причины. Постарайтесь, чтобы ваш код выглядел как заботился, когда вы его пишете.
И да: перехват исключений (особенно проблем времени выполнения, таких как исключение нулевого указателя) для их игнорировать, то есть Очень плохой. Ты просто выстрелишь себе в ногу. И вместо того, чтобы понять, почему это так и как предотвратить это в будущем, вы решаете идти дальше. Действительно очень плохо.!
На основе этой части вашего кода
//unlike photo
public static void unlike(Photo photo, User user) {
try {
likes.get(photo.remove(user));
}
catch (NullPointerException e) {
}
}
Похоже, вы удаляете фото, а не лайк
Код должен быть
//unlike photo
public static void unlike(Photo photo, User user) {
try {
likes.get(photo).remove(user);
}
catch (NullPointerException e) {
}
}
Примечание. Перехватывать исключение NullPointerException в классе — очень плохая идея. Если вы считаете, что значение, такое как фотография или пользователь, может быть нулевым, лучше проверить его, прежде чем использовать значение. Также неразумно ловить исключение, а затем игнорировать его. Спасибо @Ghostcat за указание на это.
Да, это было! Спасибо
@GhostCat Я действительно понимаю, что вы пытаетесь сказать, но если я пойду по этому пути, мне, вероятно, придется реорганизовать класс who ..
Не совсем: комментарий, говорящий «кстати: ловить NPE и игнорировать это ужасно плохо»… подойдет ;-)
Я предполагаю, что у метода
unlike
есть ошибка: вместоlikes.get(photo.remove(user))
вы должны использоватьlikes.get(photo).remove(user)
.