第六章 集合(二)

6.3.4 Iterator接口

在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,Java专门提供了一个接口Iterator。Iterator接口也是集合中的一员,但它与Collection、Map接口有所不同。Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也称为迭代器。

案例学习 6-3

import java.util.*;
public class Example03{
   public static void main(String[] args){
      ArrayList list=new ArrayList();//创建ArrayList集合
      list.add("李四");//向该集合中添加字符串
      list.add("王五");
      list.add("赵六");
      Iterator it=list.iterator();//获取Iterator对象
      while(it.hasNext()){       //判断ArrayList集合中是否存在下一个元素
         Object obj=it.next();   //取出ArrayList集合中的元素
         System.out.println(obj);
      }
   }
}

6.3.5 foreach循环 

foreach循环是一种更加简洁的for循环,也称增强for循环。foreach循环用于遍历数组或集合中的元素。具体语法格式如下:

for(容器中的元素类型 临时变量:容器变量){

       执行语句

}

 案例学习 6-5

import java.util.*;
public class Example05{
   public static void mian(string[] args){
      ArrayList list=new ArrayList ();//创建ArrayList集合
      list.add("aaa");//向Arraylist集合中添加字符串元素
      list.add("bbb");
      list.add("ccc"):
      for(Object obj:list){//使用foreach循环遍历ArrayList对象
         System.out.println(obj);//取出并打印ArrayList集合中的元素
      }
   }
}

运行结果→ 

aaa

bbb

ccc

注意:

foreach虽然书写起来很简洁,但在使用时已存在一定的具象性。当使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改。下面以一个String类型的数组为例,演示foreach循环的局限性。 

案例学习 6-6

public class Example06{
     static String[]strs=("aaa","bbb","ccc"};
     public static void main(string[] args){   //foreach循环遍历数组
          for(String str:strs){
              str="ddd";
          }
          System.out.println("foreach循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
          //for循环遍历数组
          for(int i=0;i<strs.length;i++){
               strs[i]="ddd";
          }
          System.out.println("普通for循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
     }
}

 运行结果→

foreach循环修改后的数组:aaa,bbb,ccc

普通for循环修改后的数组:ddd,ddd,ddd

【案例6-1 库存管理系统

【案例介绍】

1.任务描述

像商城和超市这样的地方,都需要有自己的库房,并且库房商品的库存变化有专人记录,这样才能保证商城和超市正常运转。

本例要求编写一个程序,模拟库存管理系统。该系统主要包括系统首页、商品入库、商品显示和删除商品功能。每个功能的具体要求如下:

  1. 系统的首页:用于显示系统所有的操作,并且可以选择使用某一个功能。
  2. 商品入库功能:首先提示是否要录入商品,根据用户输入的信息判断是否需要录入商品。如果需要录入商品,则需要用户输入商品的名称、颜色、价格和数量等信息。录入完成后,提示商品录入成功并打印所有商品。如果不需要录入商品,则返回系统首页。
  3. 商品显示功能:用户选择商品显示功能后,在控制台打印仓库所有商品信息。
  4. 删除商品功能:用户选择删除商品功能后,根据用户输入的商品编号删除商品,并在控制台打印删除后的所有商品。

本案例要求使用Collection集合存储自定义的对象,并用迭代器、增强for循环遍历集合。

2.运行结果

商品首页运行结果如图:

                   

商品入库运行结果如图:

                         

商品显示运行结果如图:

                                  

 商品出库运行结果如图:

 

 

【案例任务】

  1. 学会分析“库存管理系统”任务的实现思路。
  2. 根据思路独立完成“库存管理系统”任务的源代码编写、编译及运行。
  3. 掌握Collection以及List集合常用方法的使用。
  4. 掌握迭代器,增强for循环的使用。

【案例思路】

(1)定义仓库产品类,自定义对象定义属性。

(2)在类中定义集合,将要存储的自定义对象作为泛型。

(3)主方法中为集合添加初始化的数据,采用无线循环的方式显示菜单栏。用if...else语句判断用户索要进行的操作,用户可以键盘输入1、2、3来选择对应的操作。如果输入1可以进行商品入库,输入2可以显示库房内所有商品,输入3可以删除进行商品出库,如果不是1、2、3则提示用户操作失败。    

(4) 定义商品入库的方法,选择后首先提示用户是否录入商品。输入“no”不录入商品。直接退出并显示所有商品。输入其他任何数据开始录入商品并提示键盘输入什么。录入完毕后退出并显示所有商品。

(5) 定义显示仓库所有商品的方法,用Iterator迭代器的方法循环遍历集合打印,实现商品显示。

(6) 定义商品出库的方法,用集合删除的方法移除要删除的商品。

【案例实现】

案例实现】

其中实体类属性如文件6-1所示。  

                         文件6-1  Phone.java

public class Phone {

private String name;

     private String color;

     private double price;

    private int num;

}

以上代码是自定义对象实体类所包括的属性,我们在用时需要重写getter、setter以及构造方法。

 

库存管理系统的实现代码,如文件6-2所示。

文件6-2  example1.java

  1. package com.itheima;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Scanner;
    public class example1 {
    static Collection<Phone> c = new ArrayList();
    public static void main(String[] args) {
    c.add(new Phone("小米9", "玫瑰金",3999.00,15));
    c.add(new Phone("小米9", "幻彩紫", 3699, 28));
    c.add(new Phone("华为P30", "白金色", 5699, 2));
    c.add(new Phone("华为P30", "绚彩白", 5999, 18));
    c.add(new Phone("VIVO PLus9", "幻彩紫", 2699, 28));
    c.add(new Phone("魅族 16th", "紫金黑", 5229, 10));
    c.add(new Phone("苹果 11", "土豪金", 8999, 51));
    while(true) {
    System.out.println("欢迎使用库房管理系统,请选择要进行的操作");
    System.out.println("1. 商品入库");
    System.out.println("2. 商品显示");
    System.out.println("3. 删除商品");
    Scanner sc = new Scanner(System.in);
    int s = sc.nextInt();
    if(s == 1) {
    addwarehouse();
    System.out.println("商品入库成功,入库后仓库商品如下:");
    warehouse();
    }else if(s==2) {
    warehouse();
    }else if(s ==3) {
    System.out.println("请输入你要删除的商品编号:");
    int index=sc.nextInt();
    delwarehouse(index);
    System.out.println("商品出库成功,出库后仓库商品如下:");
    warehouse();
    }else {
    System.out.println("操作失败!!!");
    }
    }
    }
    private static void addwarehouse() {
    while(true) {
    System.out.println("您是否录入商品?");
    Scanner w = new Scanner(System.in);
    String s=w.next();
    if(!s.equals("no")) {
    Scanner sc1 = new Scanner(System.in);
    System.out.println("请输入商品的名称:");
    String name=sc1.next();
    System.out.println("请输入商品的颜色:");
    String color=sc1.next();
    System.out.println("请输入商品的价格:");
    int p=sc1.nextInt();
    System.out.println("请输入商品的数量:");
    int n=sc1.nextInt();
    c.add(new Phone(name,color,p,n));
    break;
    }else {
    break;
    }
    }
    }
    private static void warehouse() {
    //获取迭代器
    Iterator it = c.iterator();
    while(it.hasNext()) {
    Phone s = (Phone)it.next(); //向下转型
    System.out.println(s.getName()+ "..." + s.getColor() +
                  "..." + s.getPrice()+ "..." + s.getNum());
    }
    }
     private static void delwarehouse(int index) {
         c.remove(index);  
    }
    }

在文件6-2中,第9行定义了一个集合c,泛型是我们的自定义对象Phone。同时定义为静态的。从而实现的代码的复用,减少了代码的冗余。第10~17行代码是为我们定义的集合添加初始化的数据。第18~41行代码采用无线循环的方式显示菜单栏。用if...else语句判断用户索要进行的操作,用户可以键盘输入1、2、3来选择对应的操作。如果输入1可以进行商品入库,调用addwarehouse()方法实现添加商品入库,并且调用warehouse()方法实现入库后商品的显示。输入2可以显示库房内所有商品,调用warehouse()方法即实现商品的显示。输入3可以删除进行商品出库,调用delwarehouse(index)方法实现删除商品,并调用warehouse()方法即实现商品删除后的显示。用如果不是1、2、3则提示用户操作失败。第42~64代码定义商品入库的方法,选择后首先提示用户是否录入商品。输入“no”不录入商品。直接退出并显示所有商品。输入其他任何数据开始录入商品并提示键盘输入什么。录入完毕后退出并显示所有商品。第67~74行代码定义显示仓库所有商品的方法,用Iterator迭代器的方法循环遍历集合打印,实现商品显示。第76~78行代码定义商品出库的方法,用集合删除的方法移除要删除的商品。其中remove()方法是集合移除数据提供的方法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值