前面提问有一些乱,重新整理了一下

前面提问有一些乱,重新整理了一下

再把这道题目细致一些 即是只能用1到10去表示花朵的大小,对应着1到10层楼且每一层楼对用着得花朵大小都不能相同~~不能用map实现,只能用list和set实现


package com.imooc.choosebig;
import org.junit.Test;
import java.util.*;
import static java.lang.Math.random;
public class Choose {
    @Test
    public void chooseTheFlower() {
        TreeSet<Flower> flowerSet = new TreeSet<Flower>(new Comparator<Flower>() {
            public int compare(Flower o1, Flower o2) {
                return o2.getSize()-o1.getSize();
            }
        });
        Flower flower = null;
        int i=1;
        while(true){
            int size = ((int) (Math.random() * 10));
            flower = new Flower(i++, size);
            flowerSet.add(flower);
            if(flowerSet.size()==10) break;
            //这里有一个问题层数无法做到1到10的自然排序了,因为如果自动生成的花朵大小和前一个相同就被set filter?
                 //then i tried another way(way2) to solve it
        }
        for(Flower flower1 : flowerSet){
            System.out.println(flower1.getFloor()+":"+flower1.getSize());
        }
        System.out.println("应当选取"+flowerSet.first().getFloor()+"层电梯的花");
    }
}


package com.imooc.flowers;
public class Flower {
    private Integer floor;
    private Integer size;
    public Flower (){
    }
    public Flower(Integer floor, Integer size) {
        this.floor = floor;
        this.size = size;
    }
    public Integer getFloor() {
        return floor;
    }
    public void setFloor(Integer floor) {
        this.floor = floor;
    }
    public Integer getSize() {
        return size;
    }
    public void setSize(Integer size) {
        this.size = size;
    }
}


Way2:


package com.imooc.choosebig;

import org.junit.Test;

import java.util.*;

public class Choose {

    @Test

    //新建了一个set专门存储随机生成的花朵大小值

     //然后再生成的同时用list存储随机生成的flower这里却报错,想问下如何修改呢?  

    public void chooseTheFlower() {

        Set<Integer> flowerSizeSet = new HashSet<Integer>();

        Flower flower = null;

        List <Flower> flowerList = new ArrayList<Flower>();

        int i=1;

        while(true){

            int size = ((int) (Math.random() * 100));

            flowerSizeSet.add(size);

            if(flowerSizeSet.size()==10) break;

        }

        Iterator flowerSizeIt =flowerSizeSet.iterator();

        while(flowerSizeIt.hasNext()){

            int k=0;

           flower =  flowerList.get(k);

           flower =new Flower(k+1,(Integer) flowerSizeIt.next());

            k++;

            if(k==10) break;

        }

        for(int j=0; j<flowerList.size(); j++){

            System.out.println((j+1)+"floor:"+flowerList.get(j).getSize());

        }

    }

}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,这里可以使用LinkedHashSet去实现,但是由于LinkedHashSet在课程中没有涉及,所以之前老师的代码中没有使用。LinkedHashSet可以维护添加进集合的数据的顺序。实现的代码如下:

public class Test {
	public static void main(String[] args) {
		TreeSet<Flower> flowerSet = new TreeSet<Flower>(new Comparator<Flower>() {
            public int compare(Flower o1, Flower o2) {
                return o2.getSize()-o1.getSize();
            }
        });
		
		//随机生成花束的尺寸
		Set<Integer> set = new LinkedHashSet<Integer>();
		while(true) {
			int i= ((int)(Math.random()*10)); //生成1到10的数字
			set.add(i);
			if(set.size() == 10) break;
		}
		//遍历上面的set集合,将其赋值给Flower的size属性
		//楼层从1开始
		int floor = 1;
		for (Integer size : set) {
			Flower f = new Flower(floor, size);
			floor++;
			//将创建的Flower对象存储在TreeSet中
			flowerSet.add(f);
		}
		//遍历展示每层花束的结果
		for(Flower flower1 : flowerSet){
            System.out.println(flower1.getFloor()+":"+flower1.getSize());
        }
        System.out.println("应当选取"+flowerSet.first().getFloor()+"层电梯的花");
		
	}
}

祝学习愉快~


  • 晓舟 提问者 #1

    然后way2方法就没救了吗?通过List和set组合使用也不行哦?

    我先把花朵大小随机数用循环放进了set里,已经生成了10个

       while(true){

                int size = ((int) (Math.random() * 100));

                flowerSizeSet.add(size);

                if(flowerSizeSet.size()==10) break;

            }

    再通过List来赋值就会出现但发现还是不行

      while(flowerSizeIt.hasNext()){

                int k=0;

                flower = flowerList.get(k);

                flower = new Flower(k+1,(Integer) flowerSizeIt.next());

                k++;

                if(k==10) break;

            }

    这段代码无法赋值给flower

    package com.imooc.choosebig;

    import org.junit.Test;

    import java.util.*;


    public class Choose {

        @Test

        public void chooseTheFlower() {

            Set<Integer> flowerSizeSet = new HashSet<Integer>();

            Flower flower = null;

            List <Flower> flowerList = new ArrayList<Flower>();

            int i=1;

            while(true){

                int size = ((int) (Math.random() * 10));

                flowerSizeSet.add(size);

                if(flowerSizeSet.size()==10) break;

            }


            Iterator flowerSizeIt =flowerSizeSet.iterator();

            for(int l=0; l<flowerSizeSet.size();l++ ){

                flowerList.add(1);

            }

            while(flowerSizeIt.hasNext()){

                int k=0;

                flower = flowerList.get(k);

                flower = new Flower(k+1,(Integer) flowerSizeIt.next());

                k++;

                if(k==10) break;

            }


            for(Flower flower2 :flowerList){

                System.out.println(flower2.getFloor()+":"+flower2.getSize());

            }


        }

    }

    2022-03-15 11:16:51
  • 好帮手慕小蓝 回复 提问者 晓舟 #2

    同学你好,这样的实现方式是做不到的。每个Java类都有特定的使用场景,也就有无法实现的场景,所以建议同学更换实现思路。

    祝学习愉快~

    2022-03-15 11:19:49
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师