ArrayList 去重

ArrayList 去重

在写java代码中会用到ArrayList,使用过程中有一些比较奇葩的业务,需要对重复的数据去重。 
在网上找了几种方法

  • 利用HashSet里面的元素不可重复
  • 利用list里面contains方法比较是否存在去重

首页我试验了第一种方法

  1. public static void main(String args[]){

  2. ArrayList<Integer> arrayList = new ArrayList<>();

  3. arrayList.add(1);

  4. arrayList.add(2);

  5. arrayList.add(1);

  6. arrayList.add(3);

  7. arrayList.add(2);

  8. arrayList.add(3);

  9. arrayList = new ArrayList<>(new HashSet<>(arrayList));

  10. for (int i=0;i<arrayList.size();i++){

  11. printlns("arrayList ["+ i +"] = "+arrayList.get(i));

  12. }

  13. }

运行结果

  1. arrayList [0] = 1

  2. arrayList [1] = 2

  3. arrayList [2] = 3

发现确实能行啊,成功了。但是这里排重的是 Integer 类型,如果换成String 类型呢

  1. ArrayList<String> arrayList = new ArrayList<>();

  2. arrayList.add("1");

  3. arrayList.add("2");

  4. arrayList.add("2");

  5. arrayList.add("3");

  6. arrayList.add("2");

  7. arrayList.add("1");

运行结果

  1. arrayList [0] = 1

  2. arrayList [1] = 2

  3. arrayList [2] = 3

发现也行,这下放心了,后来在项目中遇到问题,如果换成对象能实现吗

所以我就加入了User对象

  1. static class User{

  2. public User(String name, int age) {

  3. this.name = name;

  4. this.age = age;

  5. }

  6. String name;

  7. int age;

  8. }

并且修改了测试数据

  1. ArrayList<User> arrayList = new ArrayList<>();

  2. arrayList.add(new User("111",10));

  3. arrayList.add(new User("111",10));

  4. arrayList.add(new User("222",20));

  5. arrayList.add(new User("111",10));

  6. arrayList.add(new User("222",20));

  7. arrayList.add(new User("333",30));

  8. arrayList.add(new User("111",10));

  9. arrayList.add(new User("111",10));

  10. arrayList = new ArrayList<>(new HashSet<User>(arrayList));

运行结果

  1. arrayList [0] = 111 , 10

  2. arrayList [1] = 111 , 10

  3. arrayList [2] = 222 , 20

  4. arrayList [3] = 111 , 10

  5. arrayList [4] = 333 , 30

  6. arrayList [5] = 111 , 10

  7. arrayList [6] = 222 , 20

  8. arrayList [7] = 111 , 10

发现去重失败,然后我又看了一下Hastset去重原理:发现HashSet里面比较用equals方法,不对,其实应该是equals和hascode方法。

这里修改一下User类

  1. static class User{

  2. public User(String name, int age) {

  3. this.name = name;

  4. this.age = age;

  5. }

  6. String name;

  7. int age;

  8. @Override

  9. public boolean equals(Object o) {

  10. if(this == o){

  11. return true;

  12. }

  13. if(o == null){

  14. return false;

  15. }

  16.  
  17. if(getClass() != o.getClass()){

  18. return false;

  19. }

  20. User user = (User) o;

  21. if(age != user.age){

  22. return false;

  23. }

  24. if(name == null){

  25. if(user.name !=null){

  26. return false;

  27. }

  28. }else{

  29. if(!name.equals(user.name)){

  30. return false;

  31. }

  32. }

  33. return true;

  34. }

  35.  
  36. @Override

  37. public int hashCode() {

  38. return 1;

  39. }

  40. }

运行结果

  1. arrayList [0] = 111 , 10

  2. arrayList [1] = 222 , 20

  3. arrayList [2] = 333 , 30

成功了,干活

Object 中 hasCode 
1. 在一个进程执行期间,如果一个对象的equals的方法做比较所用到的信息没有被修改的话,则对象调用hashCode方法多次,它必须始终如一的返回同一个整数。 
2. 如果两个对象根据equals(Object o)方法是相等的,则调用者两个对象中任意一对象的hashCode方法必须产生相同的结果 
3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这个两个对象中任一个对象的hashCode方法返回值不要产生不同的整数,但是如果不同的话,可以提高散列表的性能。

在HastSet中,基本的操作都是由HashMap低层实现的,因为HastSet底层是用HashMap来存储数据。当向HastSet中添加元素时,首先计算元素的Hashcode值,然后用这个(元素的hashcode)%(HashMap集合的大小)+1计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用equals方法比较元素是否相等,相等就不添加,否则找一个空位添加。

到这里第一种方法

第二种方法,那就来了用到contains方法来判断比较,和第一种方法类似,也是用equals方法来判断。

  1. public static List removeDuplicateWithOrder(List list) {

  2. List newList = new ArrayList();

  3. for (Object o : list) {

  4. if (!newList .contains(o)) newList.add(o);

  5. }

  6. return newList;

  7. }


转载自http://blog.csdn.net/gyh790005156/article/details/58136870

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用HashSet或LinkedHashSet来对ArrayList进行去重操作。HashSet是无序的,而LinkedHashSet是有序的。下面是两种方法的示例代码: 方法一:使用HashSet去重 ```java List<Integer> arrayList = new ArrayList<Integer>(){{add(3);add(2);add(4);add(2);add(3);add(5);add(4);add(5);}}; ArrayList<Integer> uniqueList = new ArrayList<>(new HashSet<>(arrayList)); ``` 在这个方法中,我们首先创建一个HashSet对象,将ArrayList的元素添加到HashSet中,由于HashSet的特性是不允许重复元素的,所以重复的元素会被自动去除。然后我们再将HashSet转换回ArrayList,得到去重后的结果。 方法二:使用LinkedHashSet去重 ```java List<Integer> arrayList = new ArrayList<Integer>(){{add(3);add(2);add(4);add(2);add(3);add(5);add(4);add(5);}}; ArrayList<Integer> uniqueList = new ArrayList<>(new LinkedHashSet<>(arrayList)); ``` 在这个方法中,我们使用LinkedHashSet代替HashSet,LinkedHashSet会保持元素的插入顺序,所以去重后的结果会保持原来的顺序。 无论是使用HashSet还是LinkedHashSet,都可以实现对ArrayList去重操作。具体选择哪种方法取决于你对元素顺序的要求。 #### 引用[.reference_title] - *1* *3* [【Java】为ArrayList去重](https://blog.csdn.net/yongh701/article/details/43266695)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ArrayList去重常用的四种方式及性能对比(JMH性能分析)](https://blog.csdn.net/yeahPeng11/article/details/122904072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值