【问题标题】:Sequential search on String array in Java [duplicate]Java中字符串数组的顺序搜索[重复]
【发布时间】:2012-03-07 08:13:50
【问题描述】:

我应该在字符串数组上编写顺序/线性搜索。我非常接近完成,但部分作业让我感到困惑。它表示将目标项与列表的连续元素进行比较,直到目标匹配或目标小于数组的当前元素。没有数值时,字符串如何比另一个元素多或少?也许我只是没有正确地考虑它。到目前为止,这是我的程序:

public class SequentialSearchString {
public static boolean sequential (String[] numbers){
    //Set the target item to an arbitrary String that should return true.
    String T1 = "Frank";  

    for (int i = 0; i < numbers.length; i++){
        if (numbers[i] == T1){
            return true;    
        }
        if (numbers[i] != T1){
            numbers[i] = numbers[i+1];
        }           
    }
    return false;   
}

public static boolean sequential2 (String[] numbers){
    //Set the target key to String that should return false.
    String T2 = "Ian";
    for (int i = 0; i < numbers.length; i++){
        if (numbers[i] == T2){
            return true;    
        }
        if (numbers[i] != T2){
            numbers[i] = numbers[i+1];
        }
    }
    return false;   
}


public static void main(String[] args) {
    //Create a list of 8 Strings.
    String [] numbers = 
{"Ada", "Ben", "Carol", "Dave", "Ed", "Frank", "Gerri", "Helen", "Iggy", "Joan"};   
    //If the first target item (T1) is found, return Succuss. If not, return failure.
        if (sequential(numbers) == true){
            System.out.println("Success. 'T1' was found");
        }
        else {
            System.out.println("Failure. 'T1' was not found");  
        }
    //If the second target item (T2) is found, return Succuss. If not, return failure.
        if (sequential2(numbers) == true){
            System.out.println("Success. 'T2' was found");
        }
        else {
            System.out.println("Failure. 'T2' was not found");  
        }   
    }   
}

第一种方法效果很好,但我似乎在搜索不在列表中的元素时遇到了问题。这是我运行程序后得到的错误消息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at SequentialSearchString.sequential2(SequentialSearchString.java:32)
at SequentialSearchString.main(SequentialSearchString.java:50)
Success. 'T1' was found

任何帮助理解分配和修复异常将不胜感激。

【问题讨论】:

  • 对于信息:您不能使用 == 和 != 比较字符串值,它不起作用(它只比较对象的“地址”)。你必须使用 string1.equals(string2)
  • 使用String#compareTo 比较字符串。这是一个相关的问题,可以解释更多:stackoverflow.com/questions/4064633/string-comparison-in-java
  • 对于“小于”请求,Java String 实现 Comparable。当您调用 Comparable.compareTo() 将一个对象与另一个对象进行比较时,返回值指示对象的相对自然顺序。在字符串的情况下,自然排序是按字典顺序排列的。

标签: java sequential linear-search


【解决方案1】:
numbers[i] = numbers[i+1];

很可能会导致你的ArrayIndexOutOfBoundsException

您的子句检查i &lt; numbers.length。所以你设定了界限。但是,如果i == numbers.length - 1 那么您将尝试访问i+1,它比您的数组大,所以它超出了范围。

例如:numbers.length4。所以i可以 3。使用i+1,您尝试访问numbers[4],这将是第五个位置,因为数组以0 开头,numbers[3] 将是最后一个位置。

【讨论】:

    【解决方案2】:

    ArrayIndexOutOfBoundsException 是由于您使用的事实:

    for (int i = 0; i < numbers.length; i++)
    

    和后者:

     numbers[i] = numbers[i+1];
    

    当 i 等于 numbers.length-1(最后一次迭代)时,i+1 等于 numbers.length。然后您尝试读取错误的 numbers[numbers.length](有效索引是从 0 到 numbers.length-1)。

    你必须使用:

    for(int i=0;i<numbers.length-1;i++) 
    

    防止异常。现在,我不确定它会解决你的整个问题,但肯定会解决异常。

    【讨论】:

    • 我按照你的建议做了,果然异常消失了,程序运行了,但是有一个问题。我测试了每个元素,第一个和最后一个(“Ada”和“Joan”)返回失败,即使它们实际上在列表中。有什么办法可以解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多