Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数组中搜索字符串_Java_Arrays_Multidimensional Array - Fatal编程技术网

Java 在数组中搜索字符串

Java 在数组中搜索字符串,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,抱歉,如果这是重复,但我一直在寻找这个问题的答案,但我在任何地方都找不到答案,我的最后一个问题是针对相同的代码,但有不同的问题 我需要在数组中找到一个字符串,但是数组中的所有字符串都是16个字符长,用户输入时搜索键不会是16个字符。到目前为止,我对此所做的每一次尝试都以找不到字符串而告终,尽管我知道它在数组中。我认为这与数组中实际字符串文本后的尾随空格有关,但我不确定如何处理它 这是我到目前为止的搜索声明。我要注意的是,我的compareTo()语句确实将this.name与other.name

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

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

这是我到目前为止的搜索声明。我要注意的是,我的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
案例“b”:
System.out.println();
System.out.println(“请输入客户名称:”);
字符串搜索=kb.nextLine()//阅读用户的搜索
国际广场//结果的位置
数组。排序(A);
客户搜索客户=新客户(搜索);
place=Arrays.binarySearch(A,searchCust);

如果(place如果您的搜索键与数组值不同,您的二进制搜索将无法使用compareTo找到匹配项-如果您说您已经实现了它来执行普通的旧字符串相等性检查

还有另一个binarySearch实现,它接受一个自定义的Comparator对象

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

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

或者让类Customer
实现Comparable
(请参阅)。然后实现
int compareTo(Customer otherCustomer)
在客户内部,根据
其他客户
是否应小于、等于或大于
(当前对象),返回0号

取自
数组。排序

数组中的所有元素都必须 实现可比较的接口。 此外,数组中的所有元素 必须相互可比(即, e1.compareTo(e2)不得抛出 任何元素e1的ClassCastException 以及数组中的e2)

我的笔记:

  • 确保客户正确执行自然订购(aka)或

  • 使用采用比较器的
    binarySearch
    版本(http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html)及

  • 验证输入是否符合预期(例如,它不包含额外的新行字符等),以及

  • 确保A的类型正确--
    Customer[]
    在本例中(未给出声明)。
    binarySort(string[],Customer)
    将永远不会成功。(如果使用带有比较器的binarySort版本,则不会编译类似的不匹配。)

  • 快乐编码。

    编辑:在问题澄清后

    问题是,你的用户正在输入类似“史米斯”的东西,但是你的数组元素总是被填充到16个字符中,并且可能在中间有一个搜索项,比如“约翰·史密斯”,那么我建议在每个元素上循环遍历数组并执行<代码>。 "Smith" "John Smith "

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

    < P>好的,如果二进制搜索是不可能的(似乎是这样的话),我们可以简单地实现一个简单的自定义解决方案:

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

    还是我遗漏了什么?

    请提供
    声明。@pst我刚刚添加了
    search=search.replaceAll(“(\\r\124;\\ n)”,”)
    并且它没有改变我的结果。我觉得我仍然遗漏了一些非常大的东西。/@Stas这是一个字符串、双精度、浮点(分别)数组从文件读入。由于在数组中读入分隔符语句,所有字符串都是16个字符。只是出于兴趣-您到底是如何进行名称比较检查的?使用String equals方法还是==运算符?@Lish:您可能应该发布
    客户
    类的相关部分。尤其是
    compareTo
    等于
    .Ohh。我在以前的一个实验中做了类似的事情。在这种情况下,我是否需要替换
    并返回此.name.compareTo(a.name);
    使用该语句,这样就不会重叠?但是如果用户搜索姓氏而不是第一个,会发生什么?它仍然会比较两个不相同的字符串,不是吗?:/因此您希望“Smith”与“John Smith”匹配(结尾处有6个空格)?-这稍微改变了这个问题,因为我认为在这种情况下使用
    compareTo
    是不自然的(它们实际上并不相等)。为简单起见,我只需在数组中循环并执行
    .contains()
    对每个元素进行测试-如果性能出现问题,您只想优化为二进制搜索。如果可以,我会完全拥抱您!这完全解决了我的问题。非常感谢!