有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

如何解决这个问题


共 (4) 个答案

  1. # 1 楼答案

    public int getIndex(ArrayList<String> text, String target)
        {
    
            for(int i=0;i < text.size();i++) 
            {           
               if(text.get(i).indexOf(target) == 0)
                    return i;
            }
    
            return -1;
        }
    
  2. # 2 楼答案

    使用以下命令更改getIndex方法:

    public int getIndex(ArrayList<String> text, String target)
    {
        int i = 0;         
    
        for (String s : text) {
            // Use startsWith if you want to check if the string starts with target...
            // Use contains if you want to check if contains target... 
            if (s.startsWith(target)) {
                return i;
             }
    
            i++;
        }  
    
        return -1;
    }
    
  3. # 3 楼答案

    你声称:

    My implementations works

    根据测试,在我看来不是这样的。您的代码比需要的复杂得多,这使得很难找到bug。问题是,您无缘无故有两个循环:

    while (!found && i < text.size()) //supply condition
    {           
        for (String s : text) {
        }
    }
    

    为什么这两个环都有?您正在内部循环中增加i多次

    如果简化测试,您可能会发现让所有测试通过起来更容易:

    public int getIndex(List<String> text, String target) {
        for (int i = 0; i < text.size(); i++) {
            if (text.get(i).startsWith(target)) {
                return i;
            }
        }
        return -1;
    }
    

    在这种情况下,教条式地坚持每个方法只有一个return语句会导致代码更加混乱

    注意,我已经将条件从contains(在代码中)更改为startsWith,以匹配描述。您应该为此差异添加一个测试-尝试查找一个字符串,该字符串在其中一个城市中存在,但该城市不以该值开始

    我还将参数类型更改为List<String>,因为您实际上不需要它是ArrayList<String>。(通过一些工作,您可以让它接受Iterable<String>,但这将更加复杂。)

    我还建议您开始使用JUnit或类似的工具进行测试,而不仅仅是使用System.out.println

    编辑:只是为了好玩,这个版本需要Iterable<String>并使用它来有效地处理LinkedList<String>

    public int getIndex(Iterable<String> elements, String target) {
        int index = 0;
        for (String element : elements) {
            if (element.startsWith(target)) {
                return index;
            }
            index++;
        }
        return -1;
    }
    

    (毕竟没那么难…)

  4. # 4 楼答案

    进行以下更改:

    • 去掉不必要的found变量
    • contains替换为startsWith
    • 删除for-循环,否则会多次传递数据
    • while-loop更改为for-loop

    我要说的是seems to work

    public int getIndex(ArrayList<String> text, String target)
    {
        int index = -1;
    
        for (int i = 0; index == -1 && i < text.size(); i++)
        {
           if (text.get(i).startsWith(target))
           {
               index = i;
           }
        }
    
        return index;
    }
    

    你当然可以improve on it a lot more still