java获取以目标开始的第一个字符串的索引,并给出错误的输出
此方法应返回以目标开头的第一个字符串的索引
如果没有以目标开头的字符串,则返回-1
我的实现可以工作,但不能覆盖所有的变体
代码:
public int getIndex(ArrayList<String> text, String target)
{
int i = 0;
int index = -1;
boolean found = false;
while (!found && i < text.size()) //supply condition
{
for (String s : text) {
if (s.contains(target)) {
found = true;
} else {
i++;
}
if (found) index = i;
}
}
return index;
}
测试部分:
public static void main(String[] args)
{
ArrayList<String> cities = new ArrayList<String>();
cities.add("Chicago");
cities.add("Houston");
cities.add("San Jose");
cities.add("Seattle");
cities.add("Denver");
Finder finder = new Finder();
System.out.println(finder.getIndex(cities, "C"));
System.out.println("Expected: 0");
System.out.println(finder.getIndex(cities, "S"));
System.out.println("Expected: 2");
System.out.println(finder.getIndex(cities, "D"));
System.out.println("Expected: 4");
System.out.println(finder.getIndex(cities, "X"));
System.out.println("Expected: -1");
}
此代码的覆盖范围为50/50
输入:
4
- Expected: 0
3
- Expected: 2
4
+ Expected: 4
-1
+ Expected: -1
如何解决这个问题
# 1 楼答案
# 2 楼答案
使用以下命令更改getIndex方法:
# 3 楼答案
你声称:
根据测试,在我看来不是这样的。您的代码比需要的复杂得多,这使得很难找到bug。问题是,您无缘无故有两个循环:
为什么这两个环都有?您正在内部循环中增加
i
多次如果简化测试,您可能会发现让所有测试通过起来更容易:
在这种情况下,教条式地坚持每个方法只有一个
return
语句会导致代码更加混乱注意,我已经将条件从
contains
(在代码中)更改为startsWith
,以匹配描述。您应该为此差异添加一个测试-尝试查找一个字符串,该字符串在其中一个城市中存在,但该城市不以该值开始我还将参数类型更改为
List<String>
,因为您实际上不需要它是ArrayList<String>
。(通过一些工作,您可以让它接受Iterable<String>
,但这将更加复杂。)我还建议您开始使用JUnit或类似的工具进行测试,而不仅仅是使用
System.out.println
编辑:只是为了好玩,这个版本需要
Iterable<String>
并使用它来有效地处理LinkedList<String>
:(毕竟没那么难…)
# 4 楼答案
进行以下更改:
found
变量contains
替换为startsWith
for
-循环,否则会多次传递数据while
-loop更改为for
-loop我要说的是seems to work:
你当然可以improve on it a lot more still