我实际上没有使用过JS,但Java与其非常接近。这里有一些代码可以工作,但并不是非常高效:
public boolean containsOnly(int[] findVals, int[] searchArray){
for(int i=0; i < searchArray.length; i++){
for(int j=0; j < findVals.length; j++){
if(searchArray[i] == findVals[j]){
return true;
}
}
}
return false;
}
由于这个过程实际上会循环两次数组,因此速度相对较慢,如果您在程序中经常运行这个函数,您可能不希望如此。
否则,也许其他人可以想出解决方法,但您应该能够使用递归来解决。如果您只是搜索一个元素,这非常简单(快速的谷歌搜索应该返回您需要做的内容,至少对于Java而言。再一次,我不熟悉JavaScript……真的应该尽快学习)
以下是一些代码的起点,用于尝试以递归的方式执行此操作 - 无法正常工作,您会得到NullPointerException - 有人可以提供帮助吗?
class Searcher{
public boolean contains(int[] findVals, int[] searchArray){
int pos = 0;
while(pos < findVals.length){
if(searchArray.length==0){
return false;
}
else if(searchArray[0] == findVals[pos]){
return true;
}
else{
return contains(findVals, shorten(searchArray));
}
}
return false;
}
public int[] shorten(int[] array){
int[] temp = new int[array.length-1];
for(int i=0; i<temp.length; i++){
temp[i] = array[i+1];
}
return temp;
}
public void main(String[] args){
int[] findVals = new int[]{1,2,3};
int[] searchArray = new int[]{2,1,2,3,5};
System.out.println(contains(findVals, searchArray));
}
}
否则,可能还有另一种方法可以通过二分查找来完成这个任务。(我没有时间测试是否有效,但至少为您提供了这个想法。)
import java.util.Arrays;
class Searcher{
private int binarySearcher(int[] searchArray, int find){
int left = 0;
int mid;
int right = searchArray.length - 1;
while(true){
if(left > right){
mid = -1;
break;
}
else{
mid = (left + right) / 2;
if(find < searchArray[mid]){
right = mid -1;
}
else if(find > searchArray[mid]){
left = mid + 1;
}
else{
break;
}
}
}
return mid;
}
public boolean searchFor(int[] findVals, int[] searchArray){
Arrays.sort(searchArray);
Arrays.sort(findVals);
for(int i=0; i < findVals.length; i++){
int test = binarySearcher(searchArray, findVals[i]);
if(test >= 0){
return true;
}
}
return false;
}
public void main(String[] args){
int[] findVals = new int[]{1,2,3};
int[] searchArray = new int[]{2,1,2,3,5};
System.out.println(searchFor(findVals, searchArray));
}
}
相信如果您可以使递归调用起作用,那将是最有效的方法。如果使用大型数组,则下一个最有效的方法应该是二分搜索。最后,我提出的第一种方法将是最慢的。