从零开始的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
题目描述
建立多个书架:
- 每个书架都可以储存多套丛书
- 可以对书架中的丛书进行相应操作
操作如下:
- 询问某书架上单价最高的书的价格
- 询问某书架所有丛书的总价(注意是总价不是单价的和,总价是和丛书中书籍数量有关的)
- 新增一套丛书到某个书架
- 从某个书架移除一套丛书
注意
需要使用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);
}
之后再合并就可以了。