首页 技术 正文
技术 2022年11月15日
0 收藏 324 点赞 4,307 浏览 11025 个字

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();
}
}结果:
思聪
校长
马云
----------------------
马云
校长
思聪
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,565
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905