很抱歉,如果这是重复,但我一直在寻找这个问题的答案,但我找不到任何地方,我的最后一个问题是相同的代码,但有一个不同的问题。
我需要在数组中找到一个字符串,但是数组中的所有字符串都是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
答案 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)
我的笔记:
确保客户正确实施自然排序(又名Comparable)或;
使用带有比较器的binarySearch
版本(http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html)和;
验证输入是否符合预期(例如,它不包含额外的换行符等);
确保A的类型正确 - 在这种情况下为Customer[]
(未给出声明)。 binarySort(string[], Customer)
永远不会成功。 (如果使用带有比较器的binarySort版本,则不会编译这样的不匹配。)
快乐的编码。