实验六 集合框架

(1.设计并编写一个分数类(Rational),并比较分数的大小。

要求:

1. 具有构造函数Rational(int numerator, int denominator),其中numberator表示分子,而denominator表示分母。

2. 实现Comparable接口,并实现比较分数大小的功能。

3. 设计并实现InverseComparator类(实现Comparator接口),比较两个分数的倒数的大小。

4. 随机产生100个分数,然后分别对分数本身和其倒数进行排序。

提示:

1. 不能用分子除与分母的结果来比较大小,这样不精确。

2. 分母为零时分数为无穷大,两个无穷大的数相等,无穷大的数大于一切其他数。

3. 正无穷大大于负无穷大,两个负无穷大的分数一样大,两个正无穷大的分数一样大。

4. 如果分子和分母同时为零,则分数没有意义,此时分数构造函数需要抛出IllegalRationalException异常。


结果


Rationnal.java

package shiyan6_1;

public class Rational implementsComparable<Rational>{

private int numberator,denominator;

public Rational(int numberator,int denominator) {

       this.numberator=numberator;

       this.denominator=denominator;

}

public int getNumberator() {

       return numberator;

}

public int getDenominator() {

       return denominator;

}

public int GCD(int n,int m){

        int max,min;

         max=(n>m)?n:m;

         min=(n>m)?n:m;

       if(max%min==0){

              return min;

       }else{

              returnGCD(min, max%min);

       }

}

public int LCM(int a,int b){

       return a*b/GCD(a,b);

}

public int compareTo(Rational o) {

       if(this.denominator==0&&o.denominator!=0){

              return 1;

       }else if(this.denominator!=0&&o.denominator==0){

              return-1;

       }else if(this.denominator==0&&o.denominator==0){

              return 0;

       }

       else{

       int lcm = LCM(this.denominator, o.denominator);

       int lcm1 = lcm/this.denominator;

       int lcm2 = lcm/o.denominator;

       int numberator1=this.numberator*lcm1;

       int numberator2 =o.numberator*lcm2;

       if(numberator1>numberator2){

              return 1;

       }else if(numberator1<numberator2){

              return-1;

       }else{

              return 0;

       }

       }

}

}

InverseComparator.java

package shiyan6_1;

public class InverseComparator implements Comparable<InverseComparator>{

       private int numberator,denominator;

       publicInverseComparator(int numberator,int denominator) {

              this.numberator=numberator;

              this.denominator=denominator;

       }

       public int getNumberator() {

              return numberator;

       }


       public int getDenominator() {

              return denominator;

       }


       public int GCD(int n,int m){

               int max,min;

               max=(n>m)?n:m;

               min=(n>m)?n:m;

              if(max%min==0){

                     return min;

              }else{

                     returnGCD(min, max%min);

              }

       }

       public int LCM(int a,int b){

              return a*b/GCD(a,b);

       }

       public int compareTo(InverseComparator o) {

              if(this.denominator==0&&o.denominator!=0){

                     return1;

              }else if(this.denominator!=0&&o.denominator==0){

                     return-1;

              }else if(this.denominator==0&&o.denominator==0){

                     return0;

              }

              else{

              int lcm = LCM(this.denominator, o.denominator);

              int lcm1 = lcm/this.denominator;

              int lcm2 = lcm/o.denominator;

              int numberator1=this.numberator*lcm1;

              int numberator2 =o.numberator*lcm2;

              if(numberator1>numberator2){

                     return1;

              }else if(numberator1<numberator2){

                     return-1;

              }else{

                     return0;

              }

              }

}

}

Test.java

package shiyan6_1;

import java.util.List;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Random;

public class Test {

       public static void main(String[] args) {

Randomrand = new Random();

int x = 0,y =0;

List<Rational>list = new ArrayList<Rational>();

List<Rational>list2 = new ArrayList<Rational>();

for(int i=0;i<10;i++){

       try{

              x=rand.nextInt(500);

              y=rand.nextInt(500);

              if(x==0&&y==0){

                     throw newIllegalThreadStateException();

              }

       }catch(IllegalThreadStateExceptione) {

              i--;

              System.out.println("分子和分母不能同时为0!");

       }

       list.add(newRational(x,y));

       list2.add(newRational(y,x));

}

System.out.println("排序前 分子分母都是随机生成500以内的正整数(含0):");

for (Rational rational : list){

       System.out.print(rational.getNumberator()+"/"+rational.getDenominator()+" ");

}

System.out.println("");

for (Rational rational : list2){

       System.out.print(rational.getNumberator()+"/"+rational.getDenominator()+" ");

}

System.out.println("");

System.out.println("排序后从小到大:");

Collections.sort(list);

Collections.sort(list2);

for (Rational rational : list){

       System.out.print(rational.getNumberator()+"/"+rational.getDenominator()+" ");

}

System.out.println("");

for (Rational rational : list2){

       System.out.print(rational.getNumberator()+"/"+rational.getDenominator()+" ");

}

}

}

(2.编写一个数字彩票游戏(Lottery类)。

要求:

1. 输入彩票中需要的数字个数n(必须在3到9之间)。然后程序随机产生n个互不相等个位数。

2. 输入彩票中需要匹配的最小数字数m(必须在1到n之间)。

3. 通过构造函数Lottery(n, m)构造彩票游戏对象。

4. 提示用户输入n个互不相等的猜测的数字。

5. 使用addGuess()方法往游戏类中添加用户猜测的数字。

6. 使用getAward()方法来获取用户中奖的金额。

奖金的计算:

1. 如果用户所猜测的n个数和系统生成的n个数完全相同,且顺序也完全相同,则奖金为100*8n。

2. 如果用户所猜测的n个数和系统生成的n个数完全相同,但是顺序不相同,则奖金为6n。

2. 如果用户所猜测的n个数中,有p

(0<p<n)个数与系统生成的一致,则奖金为100*2p。

提示:

1. 使用equals()方法可以带顺序比较两个集合。

2. 使用containsAll()方法可以比较两个集合包含关系,不管顺序。

3. 产生n选m组合的过程比较困难,请参考附件中的Combination.java文件。其中Combination. getAllCombinations(collection,

m)方法返回含有n个元素的集合collection中选取m个元素所组成的所有组合。

运行结果
运行结果


Lottery.java

package shiyan6_2;

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashSet;

import java.util.Random;

import java.util.Set;

import java.util.List;


public class Lottery {

private int n=3,m=1,flag=0;

public int getFlag() {

       return flag;

}

public void ListFlag(int flag) {

       this.flag = flag;

}

public int getN() {

       return n;

}

public void ListN(int n) {

       this.n = n;

}

public int getM() {

       return m;

}

public void ListM(int m) {

       this.m = m;

}

private List<Integer> list = new ArrayList<Integer>();

private Set<Integer> set = new HashSet<Integer>();

private List<Integer> s = new ArrayList<Integer>();

private Set<Integer> s1 = new HashSet<Integer>();

public Boolean addGuess(int e){

       if(s1.add(e)){

              s.add(e);

              return true;

       }else{

              return false;

       }

}

public double getAward(){

       if(list.equals(s)){

              System.out.println("猜对了"+this.n+"个且顺序一样,祝贺你!");

              returnMath.pow(8,this.n)*100;

       }else if(list.containsAll(s)){

              System.out.println("猜对了"+this.n+"个但顺序不一样!");

              returnMath.pow(6,this.n);

       }else{

              if(getAllCombinations(list)>=this.m){

                     returnMath.pow(2,getAllCombinations(list))*100;

              }else{

                     System.out.println("很遗憾,你不满足最低要求个数~");

                     return 0;

              }

       }

}

private int getAllCombinations(List<Integer> list2) {

       int sum=0;

  int nCnt = list.size(); 

  int nBit = 1<<nCnt; 

  for (int i =1; i<= nBit; i++) { 

       Listtemp = new ArrayList<Integer>();

      for (int j = 0; j< nCnt; j++) { 

          if ((i<< (31 - j))>> 31 == -1) { 

             // System.out.print(list.get(j)+" "); 

              temp.add(list.get(j));

          } 

      }

      if(s.containsAll(temp)){

           sum=Math.max(sum, temp.size());

      }

      //System.out.println(""); 

  }

  System.out.println("猜对了"+sum+"个");

       return sum;

}

public boolean containsAll(Collection<?> c) {

       return list.containsAll(c);

}

public boolean containsAlls(Collection<?> c) {

       return s.containsAll(c);

}

public Lottery(int n,int m) {

       this.m=m;

       this.n=n;

       Randomrand = new Random();

       for(int i=0;i<n;i++){

              int x = rand.nextInt(100);

              if(set.add(x)){

                     list.add(x);

              }else{

                     i--;

              }

       }

}


public void printList(){

       System.out.println(list);

       System.out.println(s);

}

public boolean equals(Object o) {

       return list.equals(o);

}

}


Test.java

package shiyan6_2;

import java.util.Scanner;

public class Test {

       public static void main(String[] args) {

              Scannerinput = new Scanner(System.in);

              System.out.println("输入彩票中随机产生的数字个数n(必须在3到9之间)。");

              int n = input.nextInt();

              System.out.println("输入彩票中需要匹配的最小数字数m(必须在1到n之间)。");

              int m = input.nextInt();

              Lotterylottery = new Lottery(n, m);

              //lottery.printList();

              System.out.println("请用户输入"+n+"个互不相等的猜测的数字");

              for(int i=0;i<n;i++){

                     System.out.println("第"+i+"个");

                     int e = input.nextInt();

                     if(lottery.addGuess(e)){

                     }else{

                            System.out.println("您已经猜过这个数了,请重新输入。");

                            i--;

                     }

              }

              System.out.println("您的中奖结果为:");

              System.out.println("奖金为:"+lottery.getAward()+"RMB");

              System.out.println("彩票的结果和你的结果:");

              lottery.printList();

              input.close();

       }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,314评论 0 9
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,285评论 0 19
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,858评论 0 2
  • 突然想到 这几天心情不好的原因 很简单,或许只是想家了 想那里的一切 想在家的生活了 仅此而已 想哭。 自己还是很...
    Cheryl_ak717阅读 115评论 0 0
  • 2017年10月27日 坚持分享第78天 最近几天的晨读刘老师读的都是《熙琄叙语》里的自我照顾部分的内容,...
    周老师成长记录仪阅读 378评论 0 0