从零开始的JAVA学习-pre02

从零开始的JAVA学习-pre02

task1

题目描述

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

7种操作:

type attribute 意义 输出
1/2/3 查询Bookset的名字/单价/数量 相应的名字/单价/数量
4 name Bookset名字更改为name
5 price Bookset价格更改为price
6 num Bookset数量更改为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全部属性,新添加最小阅读年龄age Bookset原有属性不变,age为整数
Novel 包括OtherA全部属性,新添加完结与否标志finish OtherA原有属性不变,finish为boolean类型
Poetry 包括OtherA全部属性,新添加作者author OtherA原有属性不变,author为字符串
OtherS 包括Bookset全部属性,新添加出版年份year Bookset原有属性不变,year为整数
Math 包括OtherS全部属性,新添加使用年级 OtherS原有属性不变,年级为整数
Computer 包括OtherS全部属性,新添加专业类型 OtherS原有属性不变,专业类型为字符串

需要实现的操作有:

type attribute 意义 输出
1 i name 查询i号书架上书名为name的丛书信息 丛书的全部属性,各项间以空格分隔(与输入顺序一致)
2 i 查询i号书架的有多少种丛书 一个整数
3 i 查询i号书架的书籍总数 一个整数
4 i type name price num var1 var2(无换行) i号书架移入类型为type、书名为name、单价为price、总数为num(可能有属性var1、var2)的丛书
5 i name i号书架移出书名为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 异常 输出
1 i号非空书架上不存在书名为name的书 Oh, no! We don’t have name.
1 2 3 i号书架为空书架 Oh, no! This is empty.
4 i号书架上已存在书名为name的书 Oh, no! The name exist.
5 i号书架上不存在书名为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

题目描述

新增合并书架操作:

type attribute 意义 输出
6 i j i号书架和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);
}

之后再合并就可以了。

猜你喜欢

转载自blog.csdn.net/qq_45551930/article/details/113964814
今日推荐