从零开始的JAVA学习-pre02

3 篇文章 0 订阅

从零开始的JAVA学习-pre02

task1

题目描述

构造一个Bookset类,来表示多册书籍构成的一套丛书,要求Bookset类包含属性:书名、单价(单价是指一套丛书中单册书籍的价格)以及含有单册书籍的数量(我们规定丛书中每册书单价相同)。相应的要求完成的程序可以查询丛书的名字、单价、数量以及这套书的总价。 一开始给出一套丛书。

7种操作:

typeattribute意义输出
1/2/3查询Bookset的名字/单价/数量相应的名字/单价/数量
4nameBookset名字更改为name
5priceBookset价格更改为price
6numBookset数量更改为num
7查询Bookset总价一个浮点数表示总价

注意

  • 浮点数为double精度,整数为long

题解

作为第一题,考察的就是新建一个类以及封装类,可以看到前6个操作就是3个属性对应的setter和getter,这个可以直接偷懒自动生成:

对要生成setter和getter的变量按Alt+Insert,点生成就可以了。

在这里插入图片描述

这样就已经做完了前6个操作了,再加一个返回总价的方法即可。

总的来说是没啥坑点,主要是熟悉提交。这里我用了一个懒鬼专属的玩意(Github Desktop),直接先把gitlab的相应仓库clone到本地,然后把代码(.java文件)复制粘贴到刚刚clone的文件夹里,最后commit和push一下即可。(图形界面真香)

还有就是代码风格,可以先对每一个文件用一下Ctrl+Alt+L,差不多就自动调好了(行数限制字数限制之类的要自己去改),再用checkstyle去改。

task2

题目描述

建立多个书架:

  • 每个书架都可以储存多套丛书
  • 可以对书架中的丛书进行相应操作

操作如下:

  1. 询问某书架上单价最高的书的价格
  2. 询问某书架所有丛书的总价(注意是总价不是单价的和,总价是和丛书中书籍数量有关的)
  3. 新增一套丛书到某个书架
  4. 从某个书架移除一套丛书

注意

需要使用BigDecimal、BigInteger,特别注意在task1中写的那个总价也要换成BigDecimal

题解

新建一个Bookshelf类,内部做一个容器(可以使用Hashmap)去放Bookset,同时在Bookshelf类里实现4个操作方法。在main里再建一个容器去放Bookshelf,作为我们的图书馆。

ArrayList<Bookshelf> lib = new ArrayList<Bookshelf>();
for (int i = 0; i < n; i++) {
	Bookshelf bookshelf = new Bookshelf();
	lib.add(bookshelf);
}//别忘了初始化添加n个书架

在查询某号书架时,使用lib.get(i - 1)即可对第i号书架操作。(注意书架是从1号开始的)

task3

题目描述

  • 建立不同的丛书类。丛书类应当
    • 符合某种继承关系
    • 配备信息查询方法
  • 建立统一的书架类,用于管理丛书实例。书架类应当
    • 配备相应的丛书添加、丛书移除、丛书查询方法

丛书分为三个大类,Art(文)、Science(理)、Other。而Art类细分类为Novel、Poetry和OtherA。Science则分为Math、Computer和OtherS。

书籍类型属性属性类型
Other与基础类Bookset相同与基础类Bookset相同
OtherA包括Bookset全部属性,新添加最小阅读年龄ageBookset原有属性不变,age为整数
Novel包括OtherA全部属性,新添加完结与否标志finishOtherA原有属性不变,finish为boolean类型
Poetry包括OtherA全部属性,新添加作者authorOtherA原有属性不变,author为字符串
OtherS包括Bookset全部属性,新添加出版年份yearBookset原有属性不变,year为整数
Math包括OtherS全部属性,新添加使用年级OtherS原有属性不变,年级为整数
Computer包括OtherS全部属性,新添加专业类型OtherS原有属性不变,专业类型为字符串

需要实现的操作有:

typeattribute意义输出
1i name查询i号书架上书名为name的丛书信息丛书的全部属性,各项间以空格分隔(与输入顺序一致)
2i查询i号书架的有多少种丛书一个整数
3i查询i号书架的书籍总数一个整数
4i type name price num var1 var2(无换行)i号书架移入类型为type、书名为name、单价为price、总数为num(可能有属性var1、var2)的丛书
5i namei号书架移出书名为name的丛书一个整数,表示移出丛书后该书架的剩余书籍总数

题解

  • 工厂模式

使用工厂模式,其实就是把各种不同的Bookset类的构建用一个switch封装为一个新的类BookFactory,专门用于Bookset的生产。

public class BookFactory {
    public  static Bookset getBookset(String type, String name, double price, long num,String var1, String var2) {
        switch (type) {
            case "Other": return new Other(name,price,num);
            case "OtherA": return new OtherA(name,price,num,Integer.parseInt(var1));
            case "OtherS": return new OtherS(name,price,num,Integer.parseInt(var1));
            case "Novel":
                return new Novel(name,price,num,Integer.parseInt(var1),Boolean.parseBoolean(var2));
            case "Poetry": return new Poetry(name,price,num,Integer.parseInt(var1),var2);
            case "Math":
                return new Math(name,price,num,Integer.parseInt(var1),Integer.parseInt(var2));
            case "Computer": return new Computer(name,price,num,Integer.parseInt(var1),var2);
            default: return null;
        }
    }
}

这里我是直接把所有的参数以字符串的形式传进来,再switch后对于不同的Bookset把var1和var2转成需要的格式。

在Main中则是采用了每次读一行字符串的方式,再用split将这一行分割:

String inputtext = scanner.nextLine();
String[] values = inputtext.split(" ");//使用时直接写values[i]并转为相应的格式

对于var1和var2只需要判断values的长度即可。

  • 继承关系

将Bookset换为abstract类,同时添加一个BookType属性以及一个toString方法(这个由子类实现)

private Booktype booktype;
public abstract String toString();

然后Art、Science、Other继承Bookset;Novel、Poetry和OtherA继承Art;Math、Computer和OtherS继承Science。在每一个子类中都添加其特有的属性并实现toString方法。

task4

题目描述

type异常输出
1i号非空书架上不存在书名为name的书Oh, no! We don’t have name.
1 2 3i号书架为空书架Oh, no! This is empty.
4i号书架上已存在书名为name的书Oh, no! The name exist.
5i号书架上不存在书名为name的书mei you wo zhen mei you.

注意

题目输入格式不一定完全按格式输入,可能有多余的参数输入。

题解

这里我就直接抛出异常了(

比如

int length = booksetlist.size();
if (length == 0) {
    throw new Exception("Oh, no! This is empty.");
}

然后main里面try catch一下就可以。

其次按照我task3的输入方式,不管后面多输入了几个参数,都与我无关。

task5

题目描述

新增合并书架操作:

typeattribute意义输出
6i ji号书架和j号书架求并一个整数,表示新书架的编号

题解

在Bookset里加入compareTo和clone,由子类实现即可,如Poetry的比较:

@Override
public Boolean compareTo(Bookset bs) {
    if (bs.getBooktype() != this.getBooktype()) {//如果比较的Bookset类型都不一样的话肯定不是一种书
        return false;
    }
    Poetry p = (Poetry) bs;
    return super.compareTo(bs) && p.getAuthor().equals(this.author);
}

之后再合并就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值