实验4 容器(4学时)
**二、实验内容
1.用HashMap模拟一个网上购物车。要求:从键盘输入n本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:键盘输入可使用Scanner类】
package unsafe1;
import java.util.*;
public class Main{
//定义一个类里面的静态方法getSum,传入HashMap带泛型的变量books
//返回书的总价
static double getSum(HashMap<Book,Double> books){
double sum = 0;
for(double value:books.values())
{
sum += value;
}
return sum;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
HashMap<Book,Double> map = new HashMap<>();
int n = sc.nextInt();
//输入n种书籍,存入HashMap中
for(int i = 0;i < n;i++)
{
String name = sc.next();
double price = sc.nextDouble();
int nums = sc.nextInt();
double sum = price*nums;
map.put(new Book(name,price,nums),sum);
}
//输出总价
double S = getSum(map);
System.out.println(S);
}
}
//定义书本类,定义构造器,属性有名字,单价,数量
//总价即为:单价*数量
class Book{
String name;
double price;
int nums;
public Book(String name, double price, int nums) {
this.name = name;
this.price = price;
this.nums = nums;
}
}
2.写一个彩票的模拟程序:30选7。随机(1~30之间)生成7个随机数,注意不能重复。然后从键盘输入7个数,对比7个数是否与随机数有的。最后显示“中了几个号”。同时,如果中了7个号,显示一等奖;如果中了6个号,显示二等奖;如果中了5个号,显示三等奖。要求:首先在注释中写出程序的实现思想,特别是程序所使用的数据结构,然后写出Java实现代码。【说明:键盘输入可以使用Scanner类】
/**
* 思路:首先,使用Scanner类获取键盘输入,使用Random类获取随机数
* 根据题目要求不能去重,所以使用Set容器
* 如果Random有重复值,那么一直添加元素,直到set容器长度为7
* 定义一个计数器count,每符合一个元素就++,用if/else语句进行判断,输出相应语句
*/
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a,count = 0;
Random rand = new Random();
Set<Integer> set = new HashSet<>();
for(int i = 0;i < 7;i++)
{
set.add(rand.nextInt(30));
}
//保证生产了7个不重复的数添加至set集合中
while(set.size()<7)
{
set.add(rand.nextInt(30));
}
System.out.println(set);
for(int i = 0;i < 7;i++)
{
a = sc.nextInt();
if(set.contains(a))
{
count++;
}
}
System.out.println("中了"+count+"个号");
if(count == 7)
System.out.println("恭喜您,获得一等奖!");
else if(count == 6)
System.out.println("恭喜您,获得二等奖!");
else if(count == 5)
System.out.println("恭喜您,获得三等奖!");
else
System.out.println("很遗憾,没有获得奖项");
}
}
3.模拟保皇游戏开始的发牌过程。规则:4副扑克,5个玩家。1)有一个大王标记为皇上。每次发牌时,所发牌中有该大王的玩家是皇上。2)皇帝选择侍卫(也叫保儿、腿子,游戏过程中与皇帝一伙):作为皇上的玩家从自己的牌中选择一张拥有相同三张(点数和花色都相同)的一张牌(不能是2、3、大小王),其他四个玩家中有这张牌的就是侍卫。例如,皇上有三个红桃5,其他四个玩家中有红桃5的玩家就是侍卫。特殊情况是:1)皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫;2)皇帝没有满足要求的牌,无法获得侍卫。程序要求:程序启动后生成5个玩家,并自动给他们发牌。然后输出:1)皇帝和侍卫的名字及其手里的牌(每张牌输出为“花色”+“点数”,如红桃5,牌之间用“,”分割),并按照大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3的顺序排列,相同点数但不同花色的牌要把相同花色的牌放在一起;2)那张作为侍卫所特有的牌(“花色”+“点数”)。如果无法得到侍卫,则程序输出相应的提示。例如,程序运行后输出如下的结果:
皇帝是:玩家1
皇帝的牌是:[皇上, 小王, 小王, 小王, 小王, 方片2, 黑桃2, 黑桃A, 黑桃A, 红桃A, 方片K, 梅花K, 黑桃K, 红桃K, 梅花Q, 梅花Q, 黑桃Q, 方片J, 方片J, 方片J, 红桃J, 梅花9, 黑桃9, 黑桃9, 方片8, 梅花8, 红桃8, 梅花7, 黑桃7, 黑桃7, 红桃7, 梅花6, 梅花6, 黑桃6, 黑桃6, 方片5, 梅花5, 黑桃5, 黑桃5, 梅花4, 梅花4, 梅花4, 方片3, 红桃3]
侍卫对应的牌是:方片J
侍卫是:玩家2
侍卫的牌是:[方片2, 黑桃2, 红桃2, 方片A, 方片K, 梅花K, 梅花K, 黑桃K, 红桃K, 红桃K, 黑桃Q, 红桃Q, 方片J, 方片10, 黑桃10, 红桃10, 红桃10, 红桃10, 方片9, 红桃9, 方片8, 梅花8, 梅花8, 黑桃8, 黑桃8, 黑桃8, 红桃8, 红桃8, 方片7, 黑桃7, 黑桃7, 方片6, 黑桃6, 黑桃5, 梅花4, 黑桃4, 红桃4, 红桃4, 方片3, 梅花3, 黑桃3, 红桃3, 红桃3]*
本题思路:
1:卡牌分类:特殊卡牌:大王小王,2,A,K,Q,J. 普通卡牌:10,9-------3.
卡牌分类:根据花色,黑桃红桃,方片梅花,以上可以写一个类:Cards类,提供相应构造方法
2:人物分类:皇帝,侍卫
首先每个人都需要获得牌,因此对于每个人物(Player)定义一个ArrayList 指定泛型Cards,代表玩家手中的牌,根据题目要求需要我们进行排序,排序规则不作详述,代码如下
static void SortCards(player []Player)
{ player n=new player();
for(int i=0;i<Player.length;i++)
{Sortem sc= n.new Sortem();
Collections.sort(Player[i].players,sc);
}
}
根据玩家手中的牌,判断谁是皇帝,谁是相应的侍卫,写出判断函数FindEmperor,FindProtect,具体实现不详述
3:游戏主体
定义一个ArrayList容器,使用Shuffle方法进行随机洗牌
首先进行多层for循环获得卡牌,具体来说,四副卡牌,4种花色,使用for循环获得所有卡牌存入容器ArrayList中,洗牌,发牌(5个玩家,for循环实现)
最后进行判断语句输出,调用Player类中的FindEmperor,FindProtect来判断谁是皇帝,谁是侍卫
输出具体人物,使用迭代器输出各玩家手中的牌。