【问题标题】:Removing duplicate custom objects from ArrayList从 ArrayList 中删除重复的自定义对象
【发布时间】:2015-12-22 03:02:11
【问题描述】:

我很难从自定义对象的 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;
    } 

自定义对象 equals()

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

关于为什么它实际上没有删除重复项的任何提示?或者它实际上是通过用原始替换重复项来删除重复项?不知道这里发生了什么。

【问题讨论】:

  • 如果你覆盖equals,你也需要覆盖hashcode。
  • 如果你做什么@AlexisC。说您可以将其更改为Set,它将为您完成!
  • @StackFlowed OP 已经使用了LinkedHashSet。
  • 最好使用 Set 而不是 List 来获取唯一值...
  • @StackFlowed A Set 不会为你做这件事。它使用 equals 和 hashcode 以便它可以找到对象是否是重复的(特别是对于哈希集)。

标签: java arraylist duplicates


【解决方案1】:

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

因此,如果你的 equals 是这样的:

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();
}

【讨论】:

  • 太棒了!你每天都会学到新东西 :) 所以看起来我的自定义对象将 name 变量带入了对象的哈希值,而 Set 使用这些哈希码来比较两个对象?
  • @jaytj95: 是的,因为您认为如果两个UnchainedRestaurant 对象名称相同,则它们是相等的,那么这些相同对象的哈希值也应该相同。具有 0(1) 读取时间的集合通常在内部使用散列来分发元素。对于 Java,这适用于 Sets 和 Maps。
猜你喜欢
  • 2015-07-10
  • 2015-02-22
  • 2018-12-15
  • 1970-01-01
  • 2020-12-17
  • 2011-11-24
  • 1970-01-01
  • 2016-06-17
  • 2016-07-08
相关资源
最近更新 更多