• 集合:(ArrayList)的插值和去重,包含(Iterator和listIterator)迭代器相关使用


    总结:去重用for循环,插值可用for循环和迭代器(可以方便在中间插值),如果要修改集合,就用listIterator,防止父类的Iterator没有add添加功能,也避免版本号不一致报错

    去重:contains方法,确认新集合中是否存在旧值

    1、基本数据类型String去重

    1. public class ArrayListQuChong {
    2. public static void main(String[] args) {
    3. ArrayList arr=new ArrayList();//Ait+右键竖向编辑
    4. arr.add("java");
    5. arr.add("hadoop");
    6. arr.add("hive");
    7. arr.add("java");
    8. arr.add("hello");
    9. arr.add("hadoop");
    10. //使用for循环遍历,去重
    11. ArrayList arr1=new ArrayList();//创建一个新的集合
    12. for (int i=0;i//可以将集合当作数组处理,ArriList底层代码就是数组结构
    13. // arr1.get(i)=arr.get(i);//不能这样写,因为两边都是变量
    14. if(!arr1.contains(arr.get(i))){
    15. arr1.add(arr.get(i));
    16. }
    17. }System.out.println("for循环去重"+arr1);//ArrayList自带重写了toString方法,所以可以直接打印

    2、引用数据类型的去重,去重之前首先要在ArrayListYingYong类修改toString方法 //便于直接比较内容,如果是插其他值,看是否有相同的,就用equals方法 //第一题、使用for循环去重

    1. /*使用for循环*/ ArrayList arr2=new ArrayList();
    2. ArrayListYingYong yingYong0=new ArrayListYingYong("程啊伟",22);
    3. ArrayListYingYong yingYong1=new ArrayListYingYong("小强",20);
    4. ArrayListYingYong yingYong2=new ArrayListYingYong("韩韩",18);
    5. ArrayListYingYong yingYong3=new ArrayListYingYong("小强",20);
    6. ArrayListYingYong yingYong4=new ArrayListYingYong("程啊伟",22);
    7. arr2.add(yingYong0);
    8. arr2.add(yingYong1);
    9. arr2.add(yingYong2);
    10. arr2.add(yingYong3);
    11. arr2.add(yingYong4);
    12. ArrayList arr3=new ArrayList();//创建新集合接收
    13. for(int j=0;j
    14. if(!arr3.contains(arr2.get(j))){
    15. arr3.add(arr2.get(j));
    16. }
    17. }
    18. System.out.println("引用数据类型去重:"+arr3);

    插值:equals方法,进行比较,如果是引用型数据类型,要重写其equals方法,才能直接比较内容,或者调用get方法进行比较

    需求:
            使用List集合存储字符串元素,使用迭代器遍历,遍历的时候,如果遇到"java",就向集合中添加一个元素"shujiakuaile"

    常见错误示范:

    1. public class ListDemo1 {
    2. public static void main(String[] args) {
    3. List list1 = new ArrayList();
    4. list1.add("hello");
    5. list1.add("java");
    6. list1.add("hadoop");
    7. list1.add("redis");
    8. System.out.println("list1: " + list1);
    9. Iterator iterator = list1.iterator();
    10. while (iterator.hasNext()){
    11. Object o = iterator.next();
    12. String s = (String) o;
    13. if("java".equals(s)){
    14. list1.add("shujiakuaile");
    15. }
    16. }

      我们按照需求编写代码,在遍历迭代器的时候,当遇到"java",我们是使用集合中add方法进行添加元素的,运行的时候就报错了。

    错误原因: //因为继承自父亲的迭代器中没有添加元素的方法,所以我们需要使用List中特有的迭代器进行遍历及添加
            //通过观察源码发现,List中特有的迭代器中的add方法,不仅可以对迭代器中元素进行添加,底层也针对原集合进行添加元素
            //将原集合以及迭代器的版本号也设置成一样的了,所以将来再检查版本号的时候,原集合和迭代器的版本号是一致的
            //这样就不会产生并发修改异常了
        ConcurrentModificationException 并发修改异常,迭代器遍历的时候,无法使用集合的方法对集合本身做改动。

    正确写法如下:基本数据类型(第一种是迭代器,第二种是for循环)

    1. ListIterator listIterator = list1.listIterator();
    2. // while (listIterator.hasNext()){
    3. // Object o = listIterator.next();
    4. // String s = (String) o;
    5. // if("java".equals(s)){
    6. // listIterator.add("shujiakuaile");
    7. // }
    8. // }
    9. Object[] array = list1.toArray();
    10. for (int i = 0; i < array.length; i++) {
    11. String s = (String) array[i];
    12. if("java".equals(s)){
    13. list1.add("shujiakuaile");
    14. }
    15. }
    16. System.out.println("list1: " + list1);
    17. }
    18. }

    2、引用数据类型:(迭代器插值)

    直接打印集合list,是因为其本身就重写了toString方法使用迭代器就要将其放入的内容强制转换为String类型,因为只有String类型可以用equals,迭代器自身没有这个方法,可以在引用的DieDai类中重写equals方法,或者用对象调用get方法,不然比较的是对象的地址值。

    1. import java.util.List;
    2. import java.util.ArrayList;
    3. import java.util.ListIterator;
    4. public class DieDaiQi {
    5. public static void main(String[] args) {
    6. List li=new ArrayList();
    7. DieDai a=new DieDai("java");
    8. DieDai b=new DieDai("hello");
    9. DieDai c=new DieDai("java");
    10. DieDai d=new DieDai("vajava");
    11. DieDai e=new DieDai("world");
    12. DieDai f=new DieDai("java");
    13. DieDai g=new DieDai("ja");
    14. DieDai h=new DieDai("shujia");
    15. //使用迭代之前,先把内容导入到list集合中
    16. li.add(a);
    17. li.add(b);
    18. li.add(c);
    19. li.add(d);
    20. li.add(e);
    21. li.add(f);
    22. li.add(g);
    23. String str="java";
    24. // String b1=new String();
    25. // String b2="";
    26. // Iterator iterator=li.iterator();//使用迭代器,使用迭代器遍历的时候,不能修改list集合
    27. //会出现版本号不一致错误,所以要调用list独有的方法,进行添加
    28. ListIterator listIterator =li.listIterator();
    29. while (listIterator.hasNext()){
    30. Object o=listIterator.next();
    31. DieDai d1=(DieDai) o;//转型为DeiDai,因为li里面存的是DieDai对象,且DieDai有contain和equals功能
    32. //不能转成String类型,因为list里面传入的值是DeiDai的对象,不能将其他类的对象转成String类
    33. if(d1.getName().equals(str)){//调用类方法得到传入的内容,与str进行比较,或者重写equals方法
    34. listIterator.add(h);//往集合中添加对象,不能写成用li添加,会报错:ConcurrentModificationException
    35. //显示并发修改异常,原因是版本不同
    36. //总结:用数组遍历就数组遍历方法,用迭代器就使用迭代器,用其独有的listIterator方法,将内容添加到集合中
    37. //如果添加的是同样的list对象就显示的和DieDai对象一样内容,如果是字符串,就单独显示,
    38. // 如:[DieDai{name='java'}, shujia, DieDai{name='hello'}。
    39. //正常是:[DieDai{name='java'}, DieDai{name='shujia'}, DieDai{name='hello'}.
    40. }
    41. } System.out.println(li);//此时打印集合li,其实是所指的ArrayList,因为其重写了toString方法,
    42. // 所以显示的是内容,不能打印迭代器,迭代器还是默认的引用数据类型,打印的是地址值
    43. // while (iterator.hasNext()){
    44. // Object o=iterator.next();
    45. // DieDai d1=(DieDai)o;
    46. // System.out.print(d1.getName()+"\t");
    47. // b2+=d1.getName();//用字符串接收,防止转型错误
    48. // if(d1.getName().equals(str)){
    49. // b1+=str;
    50. // }else {
    51. // continue;
    52. // }
    53. // }
    54. // System.out.println(b2+"\t"+b1+"\t");
    55. //此方法不如数组,也不如迭代器,还是老一套的拼接只能在后面添加,过于麻烦
    56. }
    57. }

  • 相关阅读:
    security如何不拦截websocket
    查阅trt engine
    Python连接MS SQLServer测试
    Dockerfile设置时区失效
    Azure vs. AssemblyAI:深度解析语音转文本服务的对决
    Xcode Revoke certificate
    SpringBoot采用Dynamic-Datasource方式实现多JDBC数据源
    Linux动态链接懒加载
    C++中OpenCV、Armadillo矩阵数据格式的转换方式
    4 个指标分析 NFT 收藏品的供需情况
  • 原文地址:https://blog.csdn.net/ABU009/article/details/141097460