本次实验给定了多个具体应用,学生不是直接针对每个应用分别编程实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可复用性)和更容易面向各种变化(可维护性)。
- 子类型、泛型、多态、重写、重载
- 继承、委派、CRP
- 语法驱动的编程、正则表达式
- 设计模式
checkLegality():
通过对已有的投票类型和未出现的投票类型进行checkLegality的正确性测试。
getScoreByOption():
给定的投票选项的名称,通过测试其getScoreByOption返回的值是否与给定值相等进行正确性的判断。
getCandidate():
给定一个投票项,通过观察调用getCandidate()返回值是否为给定的candidate。
getVoteValue():
给定一个投票项,通过观察调用getVoteValue()返回值是否为给定的value。
getCandidate():
给定一个投票项,通过观察调用getCandidate()返回值是否为给定的candidate。
getVoteValue():
给定一个投票项,通过观察调用getVoteValue()返回值是否为给定的value。
Set set = new TreeSet(new Comparator() {Election要求根据支持票数量排序,前k个候选人当选;若有多个候选人的支持票数量相等而无法自然排出前k名,则仅有那些明确可进入前k名的人当选。
@Override
public int compare(Person o1, Person o2) {
if(statistics.get(o1) > statistics.get(o2)) return -1;
else if(statistics.get(o1) < statistics.get(o2)) return 1;
return o1.getName().compareTo(o2.getName());
}
});
set.addAll(statistics.keySet());
double rank = 0.0, score = Integer.MIN_VALUE;
Iterator iterator = set.iterator();
for(int i = 0; i < Math.min(quantity, statistics.size()); i++) {
score = statistics.get(iterator.next());
}
if(!iterator.hasNext() || statistics.get(iterator.next()) != score) {
iterator = set.iterator();
for(int i = 0; i < Math.min(quantity, statistics.size()); i++) {
results.put(iterator.next(), ++rank);
}
}
else {
iterator = set.iterator();
Person person = iterator.next();
while(statistics.get(person) != score) {
results.put(person, ++rank);
person = iterator.next();
}
}
return results;
public void visit(GeneralPollImpl poll);其中visit的作用是直接对投票进行访问,并进行信息统计;getData的作用是获取统计信息。
public double getData()
String[] input = regex.split("\\|");然后对于每个选项尝试用正则表达式去匹配,用捕获组来获取各个成分。用一个变量state记录一下这个正则表达式是哪种上面情况(带数字的/不带数字,默认权值相等的)。state=1为带数字的,state=2为不带数字的。
“\S+”([+-]?\d+)考虑到java语法,需要使用转义,因此最终java语句中使用如下两种实现:
“\S+”
Pattern regexNum = Pattern.compile("\\\"(\\S+)\\\"\\(([\\+-]?\\d+)\\)");匹配完成之后使用其内部各成分来创建VoteType的options字段。
Pattern regexNoNum = Pattern.compile("\\\"(\\S+)\\\"");
if(!newDinnerResult.containsKey(dish)) newDinnerResult.put(dish, 0.0);其余部分不需要变动。测试结果如下:
double value = newDinnerResult.get(dish);
if(voteItem.getVoteValue().equals(voteType.getSupport()))
newDinnerResult.put(dish, value + 1.0);
日期 | 时间段 | 计划任务 | 实际完成情况 |
6.20 | 15:00-18:00 | 完成 VoteType 及其测试用例 | 按计划完成 |
6.21 | 8:00-11:00 | 完成VoteItem及其测试用例 | 按计划完成 |
6.22 | 16:00-20:00 | 完成 Vote 及其测试用例 | 按计划完成 |
6.23 | 19:00-21:00 | 完成Poll接口的具体实现与测试 | 未完成 |
6.24 | 7:00-23:30 | 完成具体计票规则及遴选规则的撰写 | 按计划完成 |
6.25 | 9:00-次日3:00 | 完成基于语法的数据读入与app实现 | 未完成 |
6.26 | 8:00-21:30 | 完成功能扩展与撰写报告 | 按计划完成 |
遇到的难点 | 解决途径 |
正则表达式的语法在java语句中的具体应用与java相关模块的具体实现语法了解不够深入。 | 上网查阅相关资料并咨询同学,并在实现过程中不断修改与理解。 |
理解给定的框架。 | 在实现 ADT 的途中不断理解、修改。 |
对于扩展功能的具体实现策略,如何简便迅捷地扩展实现感觉颇为棘手。 | 自己苦思冥想并咨询经验丰富的同学一些相关方法的实现手段。 |
撰写相关规约与测试策略困难,不知道怎么写 | 自己苦思冥想并在交流群里浏览他人心得体会。 |
对接口与子类的继承关系不够熟悉。 | 在实现过程中反复尝试,并在网上查阅相关文献,加深印象。 |
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |