2015-07-19 85 views
0

我想知道什麼時候我的輸出應該是如下什麼是錯我的邏輯:Java的嵌套循環的邏輯錯誤

有整數兩個數組並打印第一中第一次出現的索引列表在第二list.For例如,假設你有這些陣列:

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因爲開始於索引8存儲在list1出現在list2值的序列的list1出現兩次在list2中,從位置8開始並開始在第12位。該方法應該返回第一個這樣的位置。

目前,我的代碼不會打印出任何東西......

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(arr1[j] != arr2[i]){ 
       break; 
      } 
      if(j == arr1.length -1){ 
       System.out.println(i); 
       break; 
      } 
     } 
    } 
} 

回答

3

arr1[j] != arr2[i]應該arr1[j] != arr2[i + j]

爲什麼

在內部循環的每次迭代,你應該比較每個元素的原始子序列(arr1[j])與當前子序列中的相應元素(從arr2arr2[i + j])。您正在比較當前片中的第一個元素。

此外

你的循環終止條件應該是i + (arr1.length - 1) < arr2.length避免結合的索引的訪問出如果在arr2的最後一個元素是1(或通常等於第一元件在arr1)。

......也

第二breakreturn打印的第一次出現,你說。

全碼

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. 
      } 
     } 
    } 
+0

你能上,我需要的廣告,循環終止條件詳細點嗎?此外,爲什麼我的第二次休假是返回?我認爲無論它是休息還是返回都沒有關係,因爲我正在打印代碼,而不是其他地方... – CMSC

+0

在外循環中更改'for(int i = 0; i < (int i = 0; i +(arr1.length - 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; 
      } 
     } 
    } 
}