Java嵌套循环逻辑错误

时间:2015-07-19 01:06:48

标签: java logic nested-loops

我想知道当我的输出如下时我的逻辑出了什么问题:

有两个整数数组,它打印第二个列表中第一个列表第一次出现的索引。例如,假设您有这些数组:

int[] list1 = {1, 3, 6};
int[] list2 = {1, 3, 5, 8, 12, 1, 3, 17, 1, 3, 6, 9, 1, 3, 6}; 

然后,调用indexOf(list1, list2)应返回8,因为list1中存储的值序列从索引8开始显示在list2中。list1在{{1}中出现两次从位置8开始并从位置12开始。该方法应该返回第一个这样的位置。

目前,我的代码不会打印任何内容......

list2

2 个答案:

答案 0 :(得分:3)

arr1[j] != arr2[i]应为arr1[j] != arr2[i + j]

<强>为什么

在内循环的每次迭代中,您应该将原始子序列(arr1[j])的每个元素与您从arr2切换的当前子序列中的相应元素进行比较(arr2[i + j] )。您只是比较当前切片中的第一个元素。

<强>此外

如果i + (arr1.length - 1) < arr2.length中的最后一个元素为1(或通常等于arr2中的第一个元素),则循环终止条件应为arr1,以避免访问超出绑定索引。

<强> ...也

第二个break应为return,以便按照您的说明打印第一个匹配项。

完整代码

public static void indexOf(int[] arr1, int[] arr2) {

    for(int i = 0; i + (arr1.length - 1) < arr2.length; i++) {
        for(int j = 0; j < arr1.length; j++) {
            if(arr1[j] != arr2[i + j]) {
                break; 
            }
            if(j == (arr1.length - 1)){
                System.out.println(i);
                break; // break to print all the occurrences. return to print only the first.
            }
        }
    }

答案 1 :(得分:0)

这有效(我添加了i + j而不是j):

   public static void indexOf(int[] arr1, int[] arr2){

    for(int i = 0; i < arr2.length; i++){
        for(int j = 0; j < arr1.length; j++){
            if((i + j) < arr2.length && arr1[j] != arr2[i + j]){
                break; 
            }
            if(j == arr1.length -1){
                System.out.println(i);
                break;
            }
        }
    }
}