Java 在数组中搜索字符串
抱歉,如果这是重复,但我一直在寻找这个问题的答案,但我在任何地方都找不到答案,我的最后一个问题是针对相同的代码,但有不同的问题 我需要在数组中找到一个字符串,但是数组中的所有字符串都是16个字符长,用户输入时搜索键不会是16个字符。到目前为止,我对此所做的每一次尝试都以找不到字符串而告终,尽管我知道它在数组中。我认为这与数组中实际字符串文本后的尾随空格有关,但我不确定如何处理它 这是我到目前为止的搜索声明。我要注意的是,我的compareTo()语句确实将this.name与other.name进行了比较,所以我很困惑:Java 在数组中搜索字符串,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,抱歉,如果这是重复,但我一直在寻找这个问题的答案,但我在任何地方都找不到答案,我的最后一个问题是针对相同的代码,但有不同的问题 我需要在数组中找到一个字符串,但是数组中的所有字符串都是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()
对每个元素进行测试-如果性能出现问题,您只想优化为二进制搜索。如果可以,我会完全拥抱您!这完全解决了我的问题。非常感谢!