Java 从ArrayList中删除重复的自定义对象

Java 从ArrayList中删除重复的自定义对象,java,arraylist,duplicates,Java,Arraylist,Duplicates,我很难从自定义对象的ArrayList中删除重复项 删除重复项 public static ArrayList<UnchainedRestaurant> removeDuplicates(ArrayList<UnchainedRestaurant> arraylist) { //remove any duplicates ArrayList<UnchainedRestaurant> noDuplicates = new Arra

我很难从自定义对象的ArrayList中删除重复项

删除重复项

public static ArrayList<UnchainedRestaurant> removeDuplicates(ArrayList<UnchainedRestaurant> arraylist) {
        //remove any duplicates
        ArrayList<UnchainedRestaurant> noDuplicates = new ArrayList<>();
        Set<UnchainedRestaurant> setItems = new LinkedHashSet<UnchainedRestaurant>(arraylist);
        noDuplicates.addAll(setItems);
        return noDuplicates;
    } 
public boolean equals(Object o) {
        UnchainedRestaurant r = (UnchainedRestaurant) o;
        String name1 = this.getName();
        String name2 = r.getName();

        name1 = Util.normalizeVenueName(name1);
        name2 = Util.normalizeVenueName(name2);

        if(name1.equals(name2)) {
            return true;
        } else return false;
    }
1. 786 Kebab & Curry
2. Marlow's Tavern
3. P.F. Chang's
4. Ted's Montana Grill
5. Which Wich? Superior Sandwiches
6. Niko Niko Sushi
7. Burger 21
8. Tin Lizzys Bar and Grille
9. Saigon Flavors
10. Firehouse Subs
11. Luigi's Pizza
12. Roya Mediterranean Restaurant and Tapas Bar
13. East Coast Wings & Grill
14. Provino's Italian Restaurant
15. Kani House
16. Chow Baby
17. Mimi's Cafe
18. Monterrey Mexican Restaurant
19. Panera Bread - Mall of Georgia
20. Umami Asian Cuisine
21. Parma Tavern
7. Burger 21 --------------------------------
23. Luigi's A Slice of Italy
4. Ted's Montana Grill --------------------------------
25. Tom + Chee - Buford
2. Marlow's Tavern --------------------------------
1. 786 Kebab & Curry
28. Sushi Niko Niko
13. East Coast Wings & Grill
3. P.F. Chang's --------------------------------
31. Turkish Kitchen
32. The Cheesecake Factory
17. Mimi's Cafe
34. Aha Sushi
15. Kani House
3. P.F. Chang's --------------------------------
37. Teavana
38. Williams-Sonoma
39. Great Wraps
40. Auntie Anne's Pretzels
1. 786 Kebab & Curry --------------------------------
42. Bruster's Real Ice Cream
43. Spencer Gifts
44. Pretzelmaker
45. Little Tokyo of Georgia Mall
46. Great American Cookies
删除重复项后的输出

public static ArrayList<UnchainedRestaurant> removeDuplicates(ArrayList<UnchainedRestaurant> arraylist) {
        //remove any duplicates
        ArrayList<UnchainedRestaurant> noDuplicates = new ArrayList<>();
        Set<UnchainedRestaurant> setItems = new LinkedHashSet<UnchainedRestaurant>(arraylist);
        noDuplicates.addAll(setItems);
        return noDuplicates;
    } 
public boolean equals(Object o) {
        UnchainedRestaurant r = (UnchainedRestaurant) o;
        String name1 = this.getName();
        String name2 = r.getName();

        name1 = Util.normalizeVenueName(name1);
        name2 = Util.normalizeVenueName(name2);

        if(name1.equals(name2)) {
            return true;
        } else return false;
    }
1. 786 Kebab & Curry
2. Marlow's Tavern
3. P.F. Chang's
4. Ted's Montana Grill
5. Which Wich? Superior Sandwiches
6. Niko Niko Sushi
7. Burger 21
8. Tin Lizzys Bar and Grille
9. Saigon Flavors
10. Firehouse Subs
11. Luigi's Pizza
12. Roya Mediterranean Restaurant and Tapas Bar
13. East Coast Wings & Grill
14. Provino's Italian Restaurant
15. Kani House
16. Chow Baby
17. Mimi's Cafe
18. Monterrey Mexican Restaurant
19. Panera Bread - Mall of Georgia
20. Umami Asian Cuisine
21. Parma Tavern
7. Burger 21 --------------------------------
23. Luigi's A Slice of Italy
4. Ted's Montana Grill --------------------------------
25. Tom + Chee - Buford
2. Marlow's Tavern --------------------------------
1. 786 Kebab & Curry
28. Sushi Niko Niko
13. East Coast Wings & Grill
3. P.F. Chang's --------------------------------
31. Turkish Kitchen
32. The Cheesecake Factory
17. Mimi's Cafe
34. Aha Sushi
15. Kani House
3. P.F. Chang's --------------------------------
37. Teavana
38. Williams-Sonoma
39. Great Wraps
40. Auntie Anne's Pretzels
1. 786 Kebab & Curry --------------------------------
42. Bruster's Real Ice Cream
43. Spencer Gifts
44. Pretzelmaker
45. Little Tokyo of Georgia Mall
46. Great American Cookies

关于为什么它实际上没有删除重复项,有什么提示吗?或者它实际上是通过用原件替换副本来删除副本?不确定这里发生了什么。

您还需要重写
hashcode
方法,因为集合使用该方法分配元素,因此如果
obj1.equals(obj2)==true
,则
obj1.hashcode()==obj2.hashcode()
也必须为true

因此,如果你的等式是这样的:

public boolean equals(Object o) {
    UnchainedRestaurant r = (UnchainedRestaurant) o;
    String name1 = this.getName();
    String name2 = r.getName();

    name1 = Util.normalizeVenueName(name1);
    name2 = Util.normalizeVenueName(name2);

    if(name1.equals(name2)) {
        return true;
    } else return false;
}
hashcode
看起来像这样:

@Override
public int hashcode() {
     return Util.normalizeVenueName(this.getName()).hashcode();
}

如果重写equals,那么还需要重写hashcode。说你可以把它换成一个能帮你的@StackFlowed OP已经使用了
LinkedHashSet
。最好使用Set而不是List来获取唯一值…@StackFlowed a
Set
不适合您。它使用equals和hashcode,这样它就可以发现对象是否是重复的(特别是对于hash集)。太棒了!你每天都会学到一些新东西:)所以看起来我的自定义对象将name变量带入了对象的哈希值中,集合使用这些哈希代码来比较两个对象?@jaytj95:是的,因为你认为两个
uncainedRestarant
对象的名称相同,那么,这些相同对象的散列也应该相同。读取时间为0(1)的集合通常在内部使用哈希来分发元素。对于Java,这适用于
Set
s和
Map
s。