JavaExp11:范型与容器

Posted 咳咳n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaExp11:范型与容器相关的知识,希望对你有一定的参考价值。

1. 请设计一个顺序堆栈,(用数组来存储堆栈中的数据元素),实现堆栈的push, pop, 和top三个函数,在测试函数中生成堆栈对象并测试push, pop, 和top 三个函数(最少要测试Integer和String两种类型的对象).

package EXP2020.exp11;

import java.util.ArrayList;

/**
 * @author JM
 * @date 2020/5/19
 */

/**模拟一个顺序栈*/
class SeqStack 
    public ArrayList stack = new ArrayList();

    //获取栈顶元素
    public Object top() 
        //取栈顶元素相当于取LinkedList容器的头位置的元素
        return stack.get(stack.size() - 1);
    

    //入栈
    public void push(Object obj) 
        stack.add(obj);
    

    //出栈
    public void pop() 
        stack.remove(stack.size() - 1);
    

    //重写toString
    public String toString() 
        return stack.toString();
    


/**主类进行测试*/
public class MainTestOne 
    public static void main(String[] args) 
        //创建一个栈
        SeqStack stack = new SeqStack();
        Integer i = new Integer(12345);
        String str = new String("string");

        //测试push存放数据
        stack.push(str);
        stack.push(i);
        stack.push(456);
        stack.push("Jack");
        stack.push("Tom");
        System.out.println("移除数据之前:" + stack);

        //测试pop移除栈顶数据
        stack.pop();
        System.out.println("移除数据之后:" + stack);

        //获取栈顶元素
        Object topObj = stack.top();
        System.out.println("获得栈顶元素:" + topObj);
    


2. 用HashSet模拟一个网上购物车。要求:从键盘输入5个商品的编号、名称、单价、购买数量,将这些信息存入一个HashSet,(如果编号相同,则可以在数量上加1,不能重复存入购物车)然后将该HashSet作为参数调用方法getSum(HashSet items),该方法用于计算商品的总价并返回。

package EXP2020.exp11;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author JM
 * @date 2020/5/19
 */

/**
 * 定义购物车类
 */
class ShoppingCart 
    //商品编号、名称、单价、购买数量
    public String id;
    public String name;
    public double price;
    public int num;

    //初始化构造函数
    public ShoppingCart(String id, String name, double price, int num) 
        this.id = id;
        this.name = name;
        this.price = price;
        this.num = num;
    

    //重写toString方法
    public String toString() 
        return "商品编号:" + id + " | 商品名称:" + name + " | 价格:" + price + "元/件 | 数量:" + num + "件";
    

    //重写hashCode方法
    public int hashCode() 
        return id.hashCode();          // 返回id属性的哈希值
    

    //重写equals
    public boolean equals(Object obj) 
        if (this == obj)               // 判断是否是同一个对象
            return true;                // 如果是,直接返回true

        if (!(obj instanceof ShoppingCart))
            return false;                // 如果对象不是Commodity类型,返回false
        ShoppingCart c = (ShoppingCart) obj;
        return this.id.equals(c.id);
    


public class MainTestTwo 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        HashSet storage = new HashSet();//定义一个容器存放购物信息
        int i = 5;//输入5个商品信息

        while (i > 0) 
            String id = sc.next();
            String name = sc.next();
            double price = sc.nextDouble();
            int num = sc.nextInt();
            ShoppingCart com = new ShoppingCart(id, name, price, num);
            if (!storage.add(com))     //如果有一样的
                storage.remove(com);
                com.num++;              //同样的商品数量加1
                storage.add(com);
            
            i--;
        

        //迭代器遍历输出购物信息
        System.out.printf("\\n======================您的购物信息列表如下:==========================\\n");
        Iterator it = storage.iterator();
        while (it.hasNext()) 
            System.out.println(it.next());
        
        System.out.printf("需要消费总额: %.2f元\\n", getSum(storage));
    

    //计算总额并返回
    public static double getSum(HashSet items) 
        double moneySum = 0;
        String p;

        Iterator it = items.iterator();
        while (it.hasNext()) 
            p = it.next().toString();
            Pattern pattern1 = Pattern.compile("价格:\\\\d+.\\\\d+"); //匹配价格
            Pattern pattern2 = Pattern.compile("数量:(\\\\d+)");   //匹配数量
            Matcher m1 = pattern1.matcher(p);   //传入要匹配的原串
            Matcher m2 = pattern2.matcher(p);

            while (m1.find() && m2.find()) 
                double money = Double.parseDouble(m1.group().substring(3));
                int num = Integer.parseInt(m2.group().substring(3));
                moneySum += money * num; //计算商品总额
            
        
        return moneySum;
    


不重复的情况:

重复的情况:

第二题好像方法很多。。。哎。。
3. 写一个彩票程序:30选7。然后从键盘输入7个数,然后随机(1~30之间)生成7个随机数,注意不能重复,对比7个数是否与随机数有相同的。最后显示“中了几个号”。同时,如果中了7个号,显示一等奖;如果中了6个号,显示二等奖;如果中了5个号,显示三等奖。要求:选用合适的容器和算法。(说明:键盘输入可以使用Scanner类)

package EXP2020.exp11;

import java.util.Scanner;
import java.util.TreeSet;

/**
 * @author JM
 * @date 2020/5/19
 */
public class MainTestThree 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        TreeSet ts = new TreeSet();//定义一个TreeSet容器存放数据
        int[] myNumbers = new int[7];
        int count = 0;

        //输入7个数
        System.out.println("请输入7个数:");
        for (int i = 0; i < myNumbers.length; i++) 
            myNumbers[i] = sc.nextInt();
        

        //产生7个1~30之间的随机数,并放在容器里
        while (ts.size() < 7) 
            ts.add((int) (Math.ceil(Math.random() * 30)));
        
        System.out.println("中奖号码有:" + ts);

        //显示结果
        for (int i = 0; i < 7; i++) 
            if (ts.contains(myNumbers[i]))
                count++;
        
        switch (count) 
            case 5:
                System.out.println("恭喜获得三等奖");
                break;
            case 6:
                System.out.println("恭喜获得二等奖");
                break;
            case 7:
                System.out.println("恭喜获得一等奖");
                break;
            default:
                System.out.println("谢谢参与");
        

        System.out.println("中了"+count+"个号");
    


以上是关于JavaExp11:范型与容器的主要内容,如果未能解决你的问题,请参考以下文章

STL标准库 & 范型编程学习笔记:OOP(面向对象编程)与 GP(范型编程)容器之间的实现与分类

STL标准库 & 范型编程学习笔记:OOP(面向对象编程)与 GP(范型编程)容器之间的实现与分类

JavaExp9:输入输出流与文件操作

JavaExp9:输入输出流与文件操作

STL标准库 & 范型编程学习笔记:容器的结构分类测试

STL标准库 & 范型编程学习笔记:容器的结构分类测试