对于数组是否有任何等效的String.indexOf()?如果没有,除了线性搜索之外,有没有更快的方法在另一个中找到一个数组?
答案 0 :(得分:6)
无论数组的元素如何,我相信这与字符串搜索问题没什么不同。
这个article提供了各种已知算法的一般介绍。
Rabin-Karp和KMP可能是您的最佳选择。
您应该能够找到这些算法的Java实现并使其适应您的问题。
答案 1 :(得分:5)
List<Object> list = Arrays.asList(myArray);
Collections.sort(list);
int index = Collections.binarySearch(list, find);
OR
public static int indexOf(Object[][] array, Object[] find){
for (int i = 0; i < array.length(); i ++){
if (Arrays.equals(array[i], find)){
return i;
}
}
return -1;
}
OR
public static int indexOf(Object[] array, Object find){
for (int i = 0; i < array.length(); i ++){
if (array[i].equals(find)){
return i;
}
}
return -1;
}
OR
Object[] array = ...
int index = Arrays.asList(array).indexOf(find);
答案 2 :(得分:2)
据我所知,没有线性搜索,没有办法在另一个数组中找到数组。 String.indexOf在库中使用线性搜索。
您应该编写一个名为indexOf的小型库,它接受两个数组,然后您将拥有与indexOf类似的代码。
但不管你怎么做,这都是一个线性搜索。
编辑:
在看了@ ahmadabolkader的回答后,我有点想回来。虽然它仍然是线性搜索,但它并不像“实现它”那么简单,除非你被限制在相当小的测试集/结果中。
问题出现时,你想看看...... aaaaaaaaaaaaaaaaa是否符合(x1000000)...... aaaaaaaaab的字符串(换句话说,字符串往往与搜索字符串中的大部分位置相匹配)。
我的想法是,一旦你找到第一个字符匹配,你只需要一对一地检查所有后续字符,但是当大多数字符在大多数时间匹配时,性能会恶化。在@ a12r的答案中有一个滚动哈希方法,如果这是一个真实世界的问题而不仅仅是一个任务,听起来要好得多。
由于那些很棒的维基百科参考文献,我只想投票给@ a12r的答案。
答案 3 :(得分:0)
通常,您在java中的集合中查找内容的方式是
(1)将不适合您,因为数组对象的哈希不会告诉您内容是相同的。你可以编写一些基于内容创建哈希码的包装器(你还必须确保equals返回的值与之一致)。
(2)也需要一些工作,因为数组的对象相等只会测试对象是否相同。您需要使用内容测试来包装数组。
所以基本上,除非你自己写。
答案 4 :(得分:0)
简短的回答是否定的 - 通过在Java中使用一些现有的构造,没有更快的方法在数组中查找数组。根据您的描述,考虑创建HashSet
数组而不是数组数组。
答案 5 :(得分:0)
你的意思是你有一个数组,哪些元素也是数组元素?如果是这种情况并且元素已排序,您可以使用java.util.Arrays中的binarysearch