丨你微笑时好美丶

博客园 首页 联系 订阅 管理

iterator方法

迭代器的作用:就是用于抓取集合中的元素

注:迭代器返回的一个接口类型的实现类,是一种多态的用法,而不是接口在调用方法

public class Demo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Money m=test();
        m.makeMoney();
    }
    public static Money test(){
        return new Worker();
    }
}
interface Money{
    public void makeMoney();
}
class Worker implements Money{
    @Override
    public void makeMoney() {
        // TODO Auto-generated method stub
        System.out.println("工人在赚钱...");
    }
}

结果:
工人在赚钱...

这里就用了多态,返回了一个Money的实现类

hasNext()    问是否有元素可以遍历,若可以,则返回true
  如果仍有元素可以迭代,则返回 true。
next()     获取元素
  返回迭代的下一个元素。
remove()
  从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)

import java.util.ArrayList;
public class Demo1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Collection c=new ArrayList();
        c.add("狗娃");
        c.add("狗剩");
        c.add("铁蛋");
        c.add("美美");
        //遍历集合的元素:--------->方式一:可以使用toArray方法
        /*Object[] arr=c.toArray();//把集合的元素存储到一个Object的数组中返回
        System.out.println("集合的元素为:"+Arrays.toString(arr));
        */
        //要求使用iterator迭代器遍历
        Iterator it=c.iterator();//返回一个迭代器
        System.out.println("有元素可以遍历吗?"+it.hasNext());
        while (it.hasNext()) {
            System.out.println("元素:"+it.next());//获取元素
        }
        it.remove();
        System.out.println("集合的元素:"+c);
    }
    

}

结果:
有元素可以遍历吗?true
元素:狗娃
元素:狗剩
元素:铁蛋
元素:美美
集合的元素:[狗娃, 狗剩, 铁蛋]

 

作业2:使用集合实现注册登陆功能,

第一步: 提示用户选择功能, A(注册) B(登陆) 。 要求: 功能选择 的时候要忽略大小写。


注册:
1. 提示用户输入注册的账号(数字)与密码,如果输入的id号已经存在集合中,提示用户重新输入。 注册完毕之后,把集合中的所有用户信息打印出来。(使用:toArrry()方法)

登陆:
提示用户输入登陆的账号与密码,如果账号与密码这个用户已经存在集合中,那么登陆成功,否则登陆失败。

import java.util.ArrayList;
public class Demo3 {

    static Scanner sc=new Scanner(System.in);
    static Collection users=new ArrayList();//使用该集合保存所有的用户信息
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        while (true) {
            System.out.println("请选择功能: A(注册)   B(登陆) ");
            String option=sc.next();
            if ("a".equalsIgnoreCase(option)) {
                reg();
            }
            else if ("b".equalsIgnoreCase(option)) {
                login();
            }
            else {
                System.out.println("你的选择有误,请重新输入!");
            }
        }
    }

    public static void login() {
        System.out.println("你选择了登录功能...");
        System.out.println("请输入账号:");
        int id=sc.nextInt();
        System.out.println("请输入密码:");
        String password=sc.next();
        //判断集合的用户是否存在该用户名与密码
        //遍历集合的元素,查看是否存在该用户信息
        
        boolean isLogin=false;//定义一个变量用于记录是否登录成功的信息,默认是没有登录成功的
        Iterator it=users.iterator();
        while (it.hasNext()) {
            User user=(User)it.next();
            if (user.getId()==id&&user.getPassword().equals(password)) {
                //存在该用户信息,登录成功
                isLogin=true;
            }
        }
        if (isLogin) {
            System.out.println("欢迎登录...");
        }
        else {
            System.out.println("用户名或者密码错误,登录失败...");
        }
    }

    public static void reg() {
        User user =null;
        while (true) {
            System.out.println("请输入账号");
            int id=sc.nextInt();
            user =new User(id,null);
            //System.out.println(id);
            if (users.contains(user)) {
                //如果存在
                System.out.println("该账号已经存在,请重新输入账号");
            }
            else {
                //如果不存在
                break;
            }
        }
        //System.out.println(user.getId());
        System.out.println("请输入密码:");
        String password=sc.next();
        user.setPassword(password);
        //把user对象保存到集合中
        users.add(user);
        System.out.println("注册成功!");
        System.out.println("当前注册的人员:"+users);
    }

}
class User{
    private int id;
    private String password;
    
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public User() {}
    public User(int id,String password) {
        this.id=id;
        this.password=password;
    }
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        User user=(User)obj;
        return this.id==user.id;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "{账号:"+this.id+" 密码:"+this.password;
    }
}

结果:
请选择功能: A(注册)   B(登陆) 
a
请输入账号
110
请输入密码:
gouwa
注册成功!
当前注册的人员:[{账号:110 密码:gouwa]
请选择功能: A(注册)   B(登陆) 
b
你选择了登录功能...
请输入账号:
110
请输入密码:
gouwa
欢迎登录...
请选择功能: A(注册)   B(登陆) 
c
你的选择有误,请重新输入!
请选择功能: A(注册)   B(登陆) 
b
你选择了登录功能...
请输入账号:
110
请输入密码:
gou
用户名或者密码错误,登录失败...
请选择功能: A(注册)   B(登陆) 

 

List接口:有序,可重复

有序:集合的有序不是指自然顺序,而是指添加进去的顺序与元素出来的顺序是一致的。

ctrl+shift+/     添加多行注释

ctrl+shift+\     取消多行注释

 

添加:

add(int index, E element)     把元素添加到集合的指定索引值位置上
addAll(Collection<? extends E> c)      把参数集合的元素添加到调用者集合指定索引值的位置上

public class Demo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        list.add("狗娃");
        list.add("狗剩");
        list.add("铁蛋");
        
        /*list.add(1, "本山");*/
        List list2=new ArrayList();
        list2.add("本山");
        list2.add("沈阳");
        list.addAll(2, list2);
        System.out.println("集合的元素:"+list);
    }

}

结果:
集合的元素:[狗娃, 狗剩, 本山, 沈阳, 铁蛋]

获取:

get(int index)     根据索引值获取集合中的元素
indexOf(Object o)      找出指定元素第一次出现在集合中的索引值
lastIndexOf(Object o)      找指定的元素最后一次出现在集合中的索引值
subList(int fromIndex, int toIndex)      指定开始与结束的索引值截取集合中的元素

public class Demo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        list.add("狗娃");
        list.add("狗剩");
        list.add("铁蛋");
        list.add("狗娃");
        /*list.add(1, "本山");
        List list2=new ArrayList();
        list2.add("本山");
        list2.add("沈阳");
        list.addAll(2, list2);*/
        System.out.println("找出指定元素在集合中的索引值:"+list.indexOf("狗剩"));
        System.out.println("找到本山:"+list.indexOf("本山"));
        System.out.println("最后一次:"+list.lastIndexOf("狗娃"));
        System.out.println("get方法获取元素:"+list.get(1));
        List subList=list.subList(1, 4);
        System.out.println("子集合的元素是:"+subList);
        System.out.println("集合的元素:"+list);
    }

}

结果:
找出指定元素在集合中的索引值:1
找到本山:-1
最后一次:3
get方法获取元素:狗剩
子集合的元素是:[狗剩, 铁蛋, 狗娃]
集合的元素:[狗娃, 狗剩, 铁蛋, 狗娃]

修改:

set(int index, E element)     使用指定的元素替换指定索引值位置的元素

public class Demo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        list.add("狗娃");
        list.add("狗剩");
        list.add("铁蛋");
        list.add("狗娃");
        
        list.set(3, "本山");
        System.out.println("集合的元素:"+list);
    }

}

结果:
集合的元素:[狗娃, 狗剩, 铁蛋, 本山]

List接口中特有的方法具备的特点:操作的方法都存在索引值

只有List接口下面的集合类才具备索引值,其他接口下面的集合类都没有索引值

 

迭代:

listIterator()     返回List接口中特有的迭代器

hasPrevious()     判断是否存在上一个元素
previous()      获取上一个元素    当前指针先向上移动一个单位,然后再取出当前指针指向的元素

next()        先取出当前指针指向的元素,然后指针向下移动一个单位
————————————————————

add(E e)     把当前元素插入到当前指针指向的位置上
set(E e)      替换迭代器最后一次返回的元素

public class Demo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        list.add("狗娃");
        list.add("狗剩");
        list.add("铁蛋");
        list.add("美美");
        
        ListIterator it=list.listIterator();
        /*System.out.println("有上一个元素吗?"+it.hasPrevious());
        it.next();
        System.out.println("获取上一个元素:"+it.previous());
        it.next();
        it.next();
        it.add("张三");*/
        it.next();
        it.next();
        it.set("张三");
        System.out.println("集合的元素:"+list);
    }

}

结果:
集合的元素:[狗娃, 张三, 铁蛋, 美美]

 使用三种遍历方式遍历集合中的元素:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Demo4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        
        System.out.println("---------get方法遍历----------");
        for (int i=0;i<list.size();i++) {
            System.out.print(list.get(i)+",");
        }
        
        System.out.println("\r\n---------使用迭代器正序遍历---------");
        ListIterator it=list.listIterator();//获取到迭代器
        while (it.hasNext()) {
            System.out.print(it.next()+",");
        }
        
        System.out.println("\r\n---------使用迭代器逆序遍历---------");
        while (it.hasPrevious()) {
            System.out.print(it.previous()+",");
        }
    }

}

结果:
---------get方法遍历----------
张三,李四,王五,
---------使用迭代器正序遍历---------
张三,李四,王五,
---------使用迭代器逆序遍历---------
王五,李四,张三,

 迭代器在迭代元素的时候的时候要注意的事项:

在迭代器迭代元素的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作。

如果使用过了集合对象改变集合中的元素个数,那么就会出现ConcurrentModificationException异常。

迭代器迭代元素的过程中:迭代器一旦创建到使用的时间。

 

List:有序,可重复

常用的:

----------------|  ArrayList      ArrayList底层是维护了一个Object数组实现的,特点:查询速度快,增删慢。

----------------|   LinkedList

----------------|   Vector(了解即可)

ArrayList特有的方法:
ensureCapacity(int minCapacity)  指定容量

trimToSize()    把数组中无用的删除 比如初始容量为10 只用了3个 那么就把剩下的7个删除  

笔试题目:使用ArrayList无参的构造函数创建一个对象时,默认的容量是多少?如果长度不够使用时又自动增长多少?

 ArrayList底层是维护了一个Object数组实现的,使用无参构造函数时,Object数组默认的容量是10,当长度不够时,自动增长0.5倍

private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);//左移一位就是除以2,所以就是+0.5
        if (newCapacity - minCapacity <= 0) {
            if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                return Math.max(DEFAULT_CAPACITY, minCapacity);
            if (minCapacity < 0) // overflow
                throw new OutOfMemoryError();
            return minCapacity;
        }
        return (newCapacity - MAX_ARRAY_SIZE <= 0)
            ? newCapacity
            : hugeCapacity(minCapacity);
    }

 查询速度快:因为维护的数组元素与元素之间的内存地址是连续的,所以就像一个线性表,只需要知道首元素地址,就可以很方便的找到后面的元素了

增加:创建一个新的数组 将原数组复制进去

删除:删除待删除元素 然后把后面的全部向前移动一位

什么时候使用ArrayList:如果目前的数据是查询比较多 增删比较少的时候,就用ArrayList存储这批数据                 比如:高校的图书馆

 

 需求:编写一个函数清除集合中的重复元素 如果书号一样就是重复的元素。要求:遍历集合元素时必须使用迭代器

package cn.itcast.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
//需求:编写一个函数清除集合中的重复元素 如果书号一样就是重复的元素。要求:遍历集合元素时必须使用迭代器
public class Demo7 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList list=new ArrayList();
        list.add(new Book(110,"Java编程思想"));
        list.add(new Book(220,"Java核心技术"));
        list.add(new Book(330,"深入JavaWeb"));
        list.add(new Book(110,"Java神书"));
        
        ArrayList list2=clearRepeat(list);
        System.out.println("新集合的元素是:"+list2);
    }
    
    public static ArrayList clearRepeat(ArrayList list) {
        ArrayList newList =new ArrayList();//创建一个新的集合
        //获取迭代器
        Iterator it=list.iterator();
        while (it.hasNext()) {
            Book book=(Book)it.next();//从旧集合中获取的元素
            if (!newList.contains(book)) {
                //如果新集合没有包含该书籍,那么就存储到新集合中
                newList.add(book);
            }
        }
        return newList;
    }
}
class Book{
    int id;
    String name;
    public Book(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "{书号:"+this.id+" 书名:"+this.name+" }";
    }
    
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        Book book=(Book)obj;
        return this.id==book.id;
    }
}

结果:
新集合的元素是:[{书号:110 书名:Java编程思想 }, {书号:220 书名:Java核心技术 }, {书号:330 书名:深入JavaWeb }]

 

LinkedList:LinkedList底层是使用了链表数据结构实现的 特点:查询速度慢,增删快

LinkedList特有的方法:

LinkedList特有的方法:
1:方法介绍
addFirst(E e) 把元素加到集合的首位置上
addLast(E e) 把元素添加到集合的末尾处
getFirst() 获取集合中首位置的元素
getLast() 获取集合中末尾处的元素
removeFirst() 删除集合中的首位置元素并返回
removeLast() 删除集合中的末尾元素并返回
如果集合中没有元素,获取或者删除元素抛:NoSuchElementException
2:数据结构
1:栈 (1.6):主要用于实现堆栈数据结构的存储方式
先进后出
push()
pop()
2:队列(双端队列1.5):主要是为了让我们可以使用LinkedList模拟队列数据结构的存储方式
先进先出
offer()
poll()
3:返回逆序的迭代器对象
descendingIterator() 返回逆序的迭代器对象

import java.util.LinkedList;

public class Demo8 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LinkedList list=new LinkedList();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.addFirst("狗娃");
        list.addLast("狗剩");
        System.out.println("获取集合中首位置的元素:"+list.getFirst());
        System.out.println("获取集合中末尾的元素:"+list.getLast());
        
        System.out.println("删除集合中的首位置元素并返回:"+list.removeFirst());
        System.out.println("删除集合中的末尾元素并返回:"+list.removeLast());
        System.out.println("集合中的元素:"+list);
        
    }

}

结果:
获取集合中首位置的元素:狗娃
获取集合中末尾的元素:狗剩
删除集合中的首位置元素并返回:狗娃
删除集合中的末尾元素并返回:狗剩
集合中的元素:[张三, 李四, 王五]

需求:使用LinkedList实现堆栈数据结构的存储方式与队列的数据结构存储方式

package cn.itcast.list;

import java.util.LinkedList;

/*
     1:栈 (1.6):主要用于实现堆栈数据结构的存储方式
    先进后出
    push() 
    pop()
    2:队列(双端队列1.5):主要是为了让我们可以使用LinkedList模拟队列数据结构的存储方式
    先进先出
    offer()
    poll()
需求:使用LinkedList实现堆栈数据结构的存储方式与队列的数据结构存储方式
*/
public class Demo9 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StackList list=new StackList();
        list.add("马云");
        list.add("校长");
        list.add("思聪");
        //System.out.println(list.pop());
        int size=list.size();
        for (int i=0;i<size;i++) {
            System.out.println(list.pop());
        }
        System.out.println("----------------------");
        TeamList list2=new TeamList();
        list2.add("马云");
        list2.add("校长");
        list2.add("思聪");
        //System.out.println(list.pop());
        int size2=list2.size();
        for (int i=0;i<size2;i++) {
            System.out.println(list2.remove());
        }
    }

}
//使用LinkedList模拟堆栈的数据结构存储方式
class StackList{
    LinkedList list;
    public StackList() {
        list=new LinkedList();
    }
    //进栈
    public void add(Object o) {
        list.push(o);
    }
    //出栈
    public Object pop() {
        return list.pop();
    }
    //获取元素个数
    public int size() {
        return list.size();
    }
}
//使用LinkedList模拟队列的存储方式
class TeamList{
    LinkedList list;
    public TeamList() {
        list=new LinkedList();
    }
    public void add(Object o) {
        list.offer(o);
    }
    public Object remove() {
        return list.poll();
    }
    //获取元素个数
        public int size() {
            return list.size();
        }
}

结果:
思聪
校长
马云
----------------------
马云
校长
思聪

 

posted on 2019-04-03 22:17  丨你微笑时好美丶  阅读(159)  评论(0编辑  收藏  举报