这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。
一、Iterator接口
1.1 概述
- 迭代器父接口
- 需要注意的是:迭代遍历期间,不允许直接使用集合增删数据
1.2 方法
- next()
把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用。
- hasNext()
该方法会判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false。
- remove()
从迭代器指向的集合中移除刚刚取出的数据
1.3 练习:士兵数量
package 士兵数量;
import java.util.Random;
/*
* 封装:
* AK47武器相关的属性数据、运算代码封装成一个类组件
*/
public class AK47 {
int bullets = 25;
// 开火
public void fire() {
// 判断开火前,当前是否有子弹剩余
if(bullets == 0) {
System.out.println("没有子弹,我们不能开枪!");
return;
}
// 随机发射子弹数量
int r= new Random().nextInt(5)+3;
// 判断弹夹可用子弹数,是否满足发射要求
if(r > bullets) {
r = bullets;
}
bullets -=r;
// 开枪
for(int i = 0;i<r;i++) {
System.out.print("突");
}
System.out.println("~!");
if(bullets == 0) {
System.out.println("弹夹空了!");
}
}
public void reload() {
bullets = 25;
}
}
package 士兵数量;
import java.util.Random;
import java.util.Scanner;
/*
* 封装:
* 1.士兵相关的属性数据、逻辑运算方法,封装成一个Soldier类组件
* 2.定义一个成员变量A47()类
*/
public class Soldier{
// 成员变量or属性变量
private int id;
private int blood = 100;
private AK47 ak47; // 添加一个AK47()武器类的成员变量
// 静态成员变量
static int count;
public Soldier(int id){
// this是一个特殊引用,其引用当前对象的内存地址
// 在编写类内代码时,可以省略
this.id = id;
// 静态属于类,一般使用类名调用
Soldier.count++; // 类内可以省略
}
// 成员方法
public void go() {
System.out.println(id+"号士兵前进!");
}
public void attack() {
// 判断是否是活着的士兵
if(blood == 0) {
System.out.println("这是"+id+"士兵的尸体");
return;
}
System.out.println(id+"号士兵进攻!");
// 射击
if(ak47 != null) {
ak47.fire();// 调用AK47发射子弹
}else {
System.out.println("小拳拳捶你胸口!");
}
if(ak47.bullets == 0) { // 当子弹为0时,自动装弹
ak47.reload();
}
// 模拟进攻,随机掉血
int des = new Random().nextInt(5)+10;
blood -= des;
// 不允许出现负血值
if(blood < 0) {
blood = 0;
}
System.out.println("血量:"+this.blood);
// 血量是0,则阵亡
if(blood == 0) {
System.out.println(id+"号士兵阵亡了!");
// 士兵死亡,士兵数量递减
Soldier.count--;
}
}
public int getId() {
return id;
}
public int getBlood() {
return blood;
}
public void setAk47() {
ak47 = new AK47();
}
}
package 士兵数量;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
/*
* 用集合存放士兵。若士兵阵亡,则从集合移除,直到集合为空
*/
public class Test1 {
public static void main(String[] args) {
System.out.println("需要多少士兵!");
int n = new Scanner(System.in).nextInt();
ArrayList<Soldier> list = new ArrayList<Soldier>(n);
for(int i = 0;i<n;i++) {
Soldier s = new Soldier(i+1);
s.setAk47();
list.add(s);
}
System.out.println(list);
// 当有存活的士兵
while(list.size()!=0) {
new Scanner(System.in).nextLine();
// 迭代遍历
Iterator<Soldier> it = list.iterator();
while(it.hasNext()) {
Soldier s = it.next();
s.attack();
// 迭代遍历期间,不允许直接使用集合来增删数据
// 即不允许直接使用list.remove(s);
if(s.getBlood()==0) {
it.remove();// 不指定下标或数据,删除刚刚遍历取出的数据
System.out.println("士兵数量:"+list.size());
System.out.println("--------------------------------------------");
}
}
}
}
}