oo-pre第五次作业总结

题面

(由于第五次作业是第四次的增量开发,因此只说改变的部分)

  1. qdate指令输入的日期可能不是完整的日期,具体地,所有可能的日期格式有yyyy/MM/dd, yyyy/MM/, yyyy//dd, /MM/dd, //dd, /MM/, yyyy//,你需要输出所有符合输入日期的消息。例如若输入qdate /07/03,则你需要输出所有在07/03发布的消息,无论消息在哪一年发出。其余格式同理。
  2. qsend和qrecv将加入参数-v表示模糊搜索,类似于我们的命令行,当输入qsend -v和qrecv -v时表示对后面输入的内容进行模糊搜索,该次作业中,我们规定,输入 qsend -v “str”或qrecv -v “str”,表示检索以str为子串的名称,具体详见样例。当-v缺省时表示含义与第一次作业相同,即”精确匹配“。
  3. 对于日期,保证year∈[0,9999],month∈[1,12],day∈[1,31]。日期中可能存在前导0,比如1月可以表示为01月,258年可以表示为0258年,且保证日期合法。以及包括前导0在内,年份的位数不超过4位,月、日的位数不超过两位。

题解

由此可见,本次作业只是让我们新添加处理qdate中年月日不完整输入以及qsend/qrecv后跟-v的模糊搜索情况,针对这两种情况我给出的解决方法如下:

  • qdate年月日输入不完整
    我的思路是使用split方法将年月日分开,然后分别比较,如果分开之后是数字那么就转成整型比较,如果是空串就直接不比较而判定为真。就这样:
    String[] inputTimes = newInput.split("/");
    但是我发现了一个问题,如果出现两个斜杠靠在一起的时候(//)java会直接吃掉中间,不会当作空串放入字符串数组中。因此我就将输入字符串做了一些处理:
    String newInput = inputDate.replace("/", " / ");
    就是我把字符串中的单个斜杠都变成了“空格”,“斜杠”,“空格”,这样进行split操作的时候就可以保证不会出现斜杠贴一起或者在最前最后导致一个位置被吃掉的问题了。

然后进行处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (inputTimes[0].equals(" ")) {
this.inputYear = -1;
} else {
this.inputYear = Integer.parseInt(inputTimes[0].trim());
}
if (inputTimes[1].equals(" ") || inputTimes[1].equals(" ")) {
this.inputMonth = -1;
} else {
this.inputMonth = Integer.parseInt(inputTimes[1].trim());
}
if (inputTimes[2].equals(" ")) {
this.inputDay = -1;
} else {
this.inputDay = Integer.parseInt(inputTimes[2].trim());
}

这里就是说,如果检测到空格(年份和日期可能是一个空格,此处是斜杠前置或后置导致,月份可能是两个空格,这是两个斜杠贴在一起导致),就把对应日期赋成-1,否则利用parseInt转成原值的整形就好(由于可能也会出现空格,所以利用trim先消除空格)

然后进行匹配:

1
2
3
4
5
6
7
8
9
10
11
12
13
for (int index = 0; index < strings.size(); index++) {
int year = strings.get(index).getYear();
int month = strings.get(index).getMonth();
int day = strings.get(index).getDay();
if ((year == inputYear || inputYear == -1)) {
if ((month == inputMonth || inputMonth == -1)) {
if ((day == inputDay || inputDay == -1)) {
System.out.print(strings.get(index).getUsedString().trim());
System.out.println(";");
}
}
}
}

就是调出每一条信息的年月日信息和输入的年月日匹配就好,如果输入年月日是-1就跳过匹配(证明模糊搜索)
此处写了三个If是为了代码风格,写在一个if中会导致一行过长,而我没想到什么其他的好方法。
后续输出同第四次作业。

  • qsend -v/、qrecv -v情况
    其实这个就更简单了,利用Java自带的字符串处理方法就好。
    首先是要对输入的-v进行检测:
    1
    2
    3
    4
    5
    6
    7
    if (inputQuest.substring(0, 5).equals("qsend")) { //查询输入相同发送者
    if (inputQuest.substring(6, 8).equals("-v")) { //模糊输入
    memory.printSenderV(inputQuest.substring(9));
    } else {
    memory.printSender(inputQuest.substring(6));
    }
    }
    就是利用sbustring多检测一个-v即可,原理和之前一致,同时创建一个模糊输入的检索方法printSenderV。

然后是检测方法:

1
2
3
4
5
6
7
8
9
public void printSenderV(String inputSender) {
String[] name = inputSender.split("\"");
for (int index = 0; index < strings.size(); index++) {
if (strings.get(index).getSenderName().contains(name[1])) {
System.out.print(strings.get(index).getUsedString().trim());
System.out.println(";");
}
}
}

其实就是多了一个contains方法,其作用是如果检查的字符串中含有其括号后的字符串作为子串就返回true,所以只是改变了检测方法,其余都和第四次作业一致。这样就完成了第五次作业的增量开发。

(感觉第五次作业真是最简单的一次……)