OOpre_HW4 : 正则表达式

1.实现思路

​ 这次作业实现思路上没有特别大难度(只新增了四条指令),但实际上作业体验下来相当于新增了一条指令,很多功能可以顺带着实现。即在我的做法中OP14()是进行战斗日志存储的方法,OP15(),OP16(),OP17(),只是将存好的战斗日志输出出来。

​ 沿用“二维数组”的输入解析法,特判操作数为14时进行多行输入,引用变量row代表实际的行数(因为战斗日志不算在指令条数n内),利用正则表达式对输入的战斗日志进行解析,下面附上我的冗长的正则表达式

1
2
3
Pattern p = Pattern.compile("(\\d{4}/\\d{2})-([^\\s@#-]+)-([^\\s@#-]+)");
Pattern p1 = Pattern.compile("(\\d{4}/\\d{2})-([^\\s^@#-]+)@([^\\s@#-]+)-([^\\s@#-]+)");
Pattern p2 = Pattern.compile("(.*/.*)-(.*)@#-(.*)"); //这一条是助教改进的,还没太理解

​ 之后按照题目叙述按部就班从二维数组中取出元素操作即可。这里我将战斗日志分为三个部分:

注意:战斗日志的存储只能使用ArrayList只有这样才满有序性!

  1. 总表,在inputhandler中设置,在OP14()中读出后就将其加入总表,这样相当于沿着完整的时间线存入了战斗日志,对于OP15()的完成比较简单,只需要使用正则表达式从中提取出来,下面附上我的正则表达式(其实只需要对日期进行匹配)

    1
    
    Pattern p = Pattern.compile(date + ".+");
    
  2. 下设在Adventure类中的attacklogattackedlog分别记录这个人作为攻击者和被攻击的战斗记录,需要注意的是在实际操作中攻击者增加attacklog同时被攻击者要增加attackedlog

​ 沿着这个思路实现就好,但是助教说不够“面向对象”。(查我代码库QAQ)。

2.BUGS

​ 这次作业遇到的bug是我de时间最长的一次WWW.有很多粗心,也有一些逻辑上的不周到(第一遍写的时候没有反应过来),甚至还有笔误。这次作业我遇到的bug大部分都是输出错误,虽然要来回找很繁琐但是不值得记录,只有一个逻辑上的错误比较烦心,整整看了三个小时才通过比较AC输出调试出来,心态很崩

下面是错误代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 public boolean useequ(Adventure man, Adventure man1,String name) {
        Equipment equipment = null;
        for (Equipment item : man.equipments) {
            if (item.getName(item).equals(name)) {
                    equipment = item;
                    break;
            }
        }
        if (equipment != null) {
            if(equipment.getBecarried(equipment)){
            	int level = man.level;
            	man1.hitpoint = man1.hitpoint - equipment.getStar() * level;
            	System.out.println(man1.getId(man1) + " " + man1.gethitpoint(man1));
            	return true;
            }
        }
        return false;
    }

​ 这种实现思路的错误之处在于:在我之前的迭代思路中,“背包”是一个概念而不是一个实体,在总库equipments中进行查找时,完全可能找到名字符合但是并没有携带的equipment(即但从名字找equipment不具有唯一性,可能会找错),这样就会使得永远也加不进去战斗日志,之前的迭代作业我们知道,一个人同名的装备只能有一件状态为carried,对于名字和是否携带的双重判断才是正确的逻辑。

下面是正确代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 public boolean useequ(Adventure man, Adventure man1,String name) {
        Equipment equipment = null;
        for (Equipment item : man.equipments) {
            if (item.getName(item).equals(name)) {
                if (item.getBecarried(item)) {
                    equipment = item;
                    break;
                }
            }
        }
        if (equipment != null) {
            int level = man.level;
            man1.hitpoint = man1.hitpoint - equipment.getStar() * level;
            System.out.println(man1.getId(man1) + " " + man1.gethitpoint(man1));
            return true;
        }
        return false;
    }