6-44 数群 (30 分)

请设计如下相关接口和类:

1) 接口IntegerGroup表示以某种方式定义的一组整数,称为数群,它可以为空,也可以包含一到多个整数。该接口包含唯一的函数boolean contains(int),返回某个整数参数是否在这个IntegerGroup对象里。如group1是IntegerGroup类型的一个对象,包含两个数字-5和3,那么group1.contains(-5)返回true,group1.contains(2)返回false。请定义接口IntegerGroup

2) 类Range是IntegerGroup的实现类,表示包含在最小值和最大值之间的所有连续整数(最小和最大值包含在内)。例如new Range(-3, 2)表示数群-3,-2,-1,0,1,2。请写出完整的Range类,包括必要的成员数据、构造函数、成员函数。假定最小值小于等于最大值。

3) 类Enum也是IntegerGroup的实现类,表示多个分散整数构成的数群。例如new Enum(new int[]{1,3,5,2,-1})表示构造一个包含整数1,3,5, 2,-1的Enum对象,以整数数组作为参数。请完成类Enum,包含必要的成员数据、构造函数、成员函数。

4) 类MultipleGroups表示一组IntegerGroup对象,并用一个列表来存储多个IntegerGroup对象,MultipleGroups类有函数add,用于添加IntegerGroup对象,有函数contains,该函数以一个整数作为参数,当且仅当该IntegerGroup对象中的一个或者多个IntegerGroup对象包含这个整数时返回true。例如MultipleGroups对象multiple1包含三个对象 new Range(5, 8), new Range(10, 12), new Enum(new int[]{1, 6}),那么对multiple1.contains的调用应当返回的值如下表所示,请完成类MultipleGroup,包含必要的成员数据、构造函数、成员函数。

QQ截图20200714090611.png

Main函数已经提供,其中构造了一个MultipleGroup对象,然后读入整数n,表示构造的IntegerGroup对象的个数,接着每行表示一个IntegerGroup对象,第一个整数表示对象类型,1为Range对象,2为Enum对象。对于Range对象来说,读入最小值和最大值,对于Enum对象来说,读入包含整数的个数,然后读入各个整数并构造为一个数组传入Enum的构造函数中。最后跟着5个测试数据,调用多个MultipleGroup对象的contains方法进行测试并输出结果。

裁判测试程序样例:

/* 请在这里填写答案 */
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        MultipleGroups mg = new MultipleGroups();
        for (int i=0;i<n;i++) {
            int t = sc.nextInt();
            IntegerGroup ng = null;
            if (t==1) {//Range
                ng = new Range(sc.nextInt(), sc.nextInt());
            } else {//Enum
                int len = sc.nextInt();
                int arr[] = new int[len];
                for (int j=0;j<len;j++)
                    arr[j] = sc.nextInt();
                    ng = new Enum(arr);
            }
            mg.add(ng);
        }
        for (int i=0;i<5;i++)
           System.out.println(mg.contains(sc.nextInt()));
        }
}


输入样例:
在这里给出一组输入。例如:

3
1 5 8
1 10 12
2 2 1 6
2 9 6 3 4

输出样例:
在这里给出相应的输出。例如:

false
false
true
false
false

参考

package practice;
import java.util.*;
interface IntegerGroup{
    public boolean contains(int a);
}

class Range implements IntegerGroup
{
    int max;
    int min;
    public Range(int max, int min) {
        this.max = max;
        this.min = min;
    }
    public int getMax() {
        return max;
    }
    public void setMax(int max) {
        this.max = max;
    }
    public int getMin() {
        return min;
    }
    public void setMin(int min) {
        this.min = min;
    }

    public boolean contains(int a)
    {
        if(a>=min&&a<=max)
            return true;
        else return false;
    }
}

class Enum implements IntegerGroup
{
    int num[];

    public Enum(int[] num) {
        this.num = num;
    }

    public boolean contains(int a)
    {
        boolean flag=false;
        for(int i=0;i<num.length;i++)
            if(a==num[i]) flag=true;
        return flag;
    }
}

class MultipleGroups implements IntegerGroup
{
    IntegerGroup group[];
    int num;
    int size;

    public MultipleGroups()
    {
        num=0;
        size=10;//数组初始大小
        group=new IntegerGroup[size];
    }
    public void add(IntegerGroup integerGroup)
    {
        if(num==size)//数组满扩容
        {
            IntegerGroup []narr=new IntegerGroup[size*2];
            System.arraycopy(group,0,narr,0,num);
            group=narr;
        }
        group[num]=integerGroup;
        this.num++;
    }

    public boolean contains(int a)
    {
        boolean flag=false;
        for(int i=0;i<num;i++)//注意不要越界
        {
            if(group[i].contains(a))
            {
                flag=true;
            }
            else flag=false;
        }
        return flag;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值