在数组中搜索字符串

时间:2011-03-02 20:32:09

标签: java arrays multidimensional-array

很抱歉,如果这是重复,但我一直在寻找这个问题的答案,但我找不到任何地方,我的最后一个问题是相同的代码,但有一个不同的问题。

我需要在数组中找到一个字符串,但是数组中的所有字符串都是16个字符长,并且当用户输入时搜索键不会是16个字符。到目前为止我在此处所做的每一次尝试都以String未找到而结束,尽管我知道它在数组中。我认为它与数组中实际字符串文本之后的尾随空格有关,但我不知道如何处理它。

到目前为止,这是我的搜索声明。我会注意到我的compareTo()语句确实将this.name与other.name进行了比较,所以我很困惑:

case 'b':
      System.out.println();
      System.out.println("Please enter a customer name:");

      String search = kb.nextLine(); //read the user's search
      int place; //location of result

      Arrays.sort(A);

      Customer searchCust = new Customer(search);

      place = Arrays.binarySearch(A,searchCust);

      if (place <= 0)
        System.out.println("Cannot find customer named " + search);
     else
     {
       System.out.println("Customer found:");  
       System.out.println(A[place-1]);
        break;


 public int compareTo(Customer a)
 {
  return this.name.compareTo(a.name);
 }   //end compareTo

5 个答案:

答案 0 :(得分:1)

编辑:澄清问题后。

所以,问题是您的用户输入了类似

"Smith"
的内容,但您的数组元素总是填充为16个字符长,并且搜索字词可能位于中间位置,例如{{ 2}}然后我建议只循环遍历数组并对每个元素执行.contains()

二进制搜索是一种优化,我只会考虑性能是否会出现问题,因为它引入了很多复杂功能。

答案 1 :(得分:1)

好的,如果无法进行二进制搜索(似乎就是这种情况),我们可以实现一个简单的自定义解决方案:

public Customer findCustomerByName(Customer[] array, String pattern){
    for(Customer candidate: array){
       if(candidate.getName().contains(pattern)){
          return candidate;
       }
    }
    return null;
}

或者我错过了什么?

答案 2 :(得分:0)

如果您的搜索关键字与数组值不同,则二进制搜索将不会使用compareTo找到匹配项 - 如果您说它已实现它以执行普通的旧字符串相等检查。

还有另一个实现二元搜索的实现,它采用自定义的Comparator对象...

public static int binarySearch(Object[] a,
                               Object key,
                               Comparator c)

您可以实现自己的自定义Comparator,以将缩短的键与数组值匹配。

答案 3 :(得分:0)

或者您将课程设为客户implement Comparable(请参阅Comparable)。然后在Customer中实现int compareTo(Customer otherCustomer),其中返回&lt; 0,0或&gt; 0数字,具体取决于otherCustomer是否应小于,等于,大于this(当前对象) )。

取自Arrays.sort

  

数组中的所有元素都必须   实现Comparable接口。   此外,数组中的所有元素   必须相互比较(即,   e1.compareTo(e2)一定不能扔掉   任何元素e1的ClassCastException   和数组中的e2)。

答案 4 :(得分:0)

我的笔记:

  1. 确保客户正确实施自然排序(又名Comparable)或;

  2. 使用带有比较器的binarySearch版本(http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html)和;

  3. 验证输入是否符合预期(例如,它不包含额外的换行符等);

  4. 确保A的类型正确 - 在这种情况下为Customer[](未给出声明)。 binarySort(string[], Customer)永远不会成功。 (如果使用带有比较器的binarySort版本,则不会编译这样的不匹配。)

  5. 快乐的编码。