zoukankan      html  css  js  c++  java
  • 5.3类集(java学习笔记)集合的输出

    一、集合的输出

    迭代输出:Iteratror接口

    在输出集合时,最标准的方法是使用迭代器迭代输出。

    1,List中的迭代器。

    Iterator中包含三个方法:

    hasNex()t判断集合内是否有元素存在。

    next()返回当前元素,并让游标指向下一元素。

    remove删除next返回的当前元素。

    我们首先来看前两个方法。

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class TestIte {
        public static void main(String[] args) {
            List <Integer>l = new ArrayList<>();
            l.add(1);
            l.add(2);
            l.add(3);
            Iterator ite = l.iterator();//调用iterator实例化一个迭代器对象。
            while(ite.hasNext()){    //判断集合中是否有元素
                System.out.println(ite.next());//返回当前元素,并让游标指向下一元素。
            }
        }
    }
    运行结果:
    1
    2
    3

    我们来看l.iterator这句,这句调用的是ArratList中的iterator方法。

    它会返回一个迭代器对象。

    我么再来看Itr中的内容。

    Itr作为一个内部类,并且实现了Iterator接口。

    我们来看下Itr类里面的两个变量:

     

    cursor就是游标,由于它在一个私有类中默认为0,

    lastRet就是删除时指定的元素。

    首先我们来看下里面的hasNext()方法:

    多么的简单,就一个判断,判断cursor是否等于数组元素个数。

    我们来看第二个next():

    首先将cursor给i,然后判断下是否大于数组元素个数,大于则抛出异常。

    然后创建一个Object数组,将存储ArrayList元素的数组缓冲区给Object数组。(数组缓冲区的长度是这个ArrayList的容量),大于就抛出异常。

    将cursor向后移动一位,返回数组中的第i个元素,并将i给lastRet。

    最后我们来看下remove():

    如果lastRet小于0则抛异常,删除数组中第lastRet个元素。

    然后将lastRet给cursor(删除元素后游标要向前挪动一位,所以讲lastRet给cursor)

    举个例子,例如此时cursor=2,则lastRet=1,如果我删除了第1个元素,那么这时第2个元素就挪到第1个元素的位置了,

    cursor之前指向的第二个元素其实是删除后的第一个元素。

    然后将lastRet变成-1,所以如果两次连续的使用remove()会出现错误,因为第二次使用时lastRet还没有被cursor赋值。

    2.Set集合的输出

    Set与上面的List类似,基本方法没有太大差别;

    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    public class TestIte {
        public static void main(String[] args) {
            Set <Integer>l = new HashSet<>();
            l.add(1);
            l.add(2);
            l.add(3);
            Iterator ite = l.iterator();
            while(ite.hasNext()){//判断集合中是否有元素
                System.out.println(ite.next());
            }
        }    
    }
    运行结果:
    1
    2
    3

    3.Map集合的输出

    Map中存放的是一对值K,V,而迭代器每次只能找到一个值,所有如果要用迭代器输出Map的话需要按一下步骤。

    1.Map对象调用entruSet()方法,返回一个Set对象。

    2.用Set实例化一个Iterator

    3.通过Map.entry进行K,V分离。

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    public class TestIte {
        public static void main(String[] args) {
            Map <Integer,String>m = new HashMap<>();
            m.put(1, "A");
            m.put(2, "B");
            m.put(3, "C");
            Set<Map.Entry<Integer, String>> sm = m.entrySet();//调用entrySet方法变为Set对象,该方法返回值是Set<Map.Entry<K,V>>
            Iterator<Map.Entry<Integer, String>> mite =  sm.iterator();//为转化为Set的Map,实例化迭代器
            while(mite.hasNext()){//判断集合中是否有元素
                Map.Entry<Integer, String> mo = mite.next();//将取出的值转换为Map.Entry
                System.out.println(mo.getKey() + mo.getValue());//调用Map.Entry中的方法,取得K,V的值
            }
        }    
    }
    运行结果:
    1A
    2B
    3C

    entrySet返回一个Set<Map.Entru<K,V>>.

    Map.Entry是Map内部定义的一个接口,专门用来保存key-value的值。

    Map.Entry接口中定义了获取K,V的方法。

    可以这样理解,把K,V想象成两个小盒子,Map.Entry就是放两个小盒子的大盒子。

     一开始将装K,V的小盒子的大盒子Map.Entry作为一个类型,放入Set中,这时把K,V看出一个整体。

    然后通过Set的迭代器来实现输出,输出时又将其转换为Map.Entry,然后取出K,V。

  • 相关阅读:
    服务器键盘设置错误 完美解决
    windows 彻底删除360文件 360zipext.dll 等等
    VS2005智能设备中无法找到PInvoke DLL
    如何使用DotNet 2.0中的应用程序配置 Settings.settings
    维护应用程序状态(一):使用浏览器cookie
    NHibernate学习导航
    HTML基础(三):基本的HTML标签
    使用Cookie对象保存用户自定义设置
    ASP.NET2.0 个性化用户配置
    sealed修饰符的使用
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/9677487.html
Copyright © 2011-2022 走看看