Java编程:如何检测ArrayList中是否已存在ask方法传入的用户提问
代码修改方案
你当前的问题在于ask方法没有做重复问题校验,直接就把新问题加入列表并返回回复了,下面给出两种实现方案:
方案1:使用ArrayList内置contains()方法(推荐,代码简洁)
直接调用ArrayList自带的包含判断方法,不需要自己写循环逻辑,修改后的Magic8Ball类的ask方法如下:
public String ask( String question ) { // 先判断问题是否已经存在 if(userQuestions.contains(question)){ return "You already asked that question."; } // 新问题先加入列表 userQuestions.add(question); // 再返回随机回复 return possibleResponses.get(num.nextInt(possibleResponses.size())); }
注:这里把
nextInt(3)改成了nextInt(possibleResponses.size()),后续你新增回复选项时不需要修改这个参数,兼容性更好。
方案2:手动实现循环遍历对比(匹配你原本的实现思路)
如果你需要自己写循环逻辑来完成判断,对应实现如下:
public String ask( String question ) { boolean isExisted = false; // 遍历所有已存储的问题做对比 for(String existedQuestion : userQuestions){ // 字符串内容对比必须用equals,不能用== if(existedQuestion.equals(question)){ isExisted = true; break; } } if(isExisted){ return "You already asked that question."; } userQuestions.add(question); return possibleResponses.get(num.nextInt(possibleResponses.size())); }
你之前循环对比失败大概率是两个原因:要么是先把问题加入列表再做判断,导致每个问题都会判定为已存在;要么是用
==而不是equals对比字符串内容,==对比的是字符串对象的内存地址,不是内容。
测试类代码不需要做任何修改,直接运行即可实现需求。
内容的提问来源于stack exchange,提问作者Alex Zheng
相关产品推荐
相关产品推荐

