2014-07-01 101 views
-1

該函數應該獲取二維數組中匹配元素的索引(OriginalArray)。但是由於重複,它會繼續掃描值並最終用找到的最後一個元素替換分配給變量a,b的索引。我如何才能存儲匹配的索引值,然後停止搜索?查找在數組中找到的第一個重複元素的索引

這可能是簡單的你,

OriginalArray

15 15 14 15 12 06 12 
14 13 10 12 15 17 15 
15 15 09 11 08 15 15 
16 17 08 16 15 07 05 
19 18 19 18 17 15 14 

代碼:

int row=5; 
int col=7; 
int [][] OriginalArray = new int [row][col]; 

int a=0,b=0; 
for (int i = 0; i < row; ++i) { 
    for (int j = 0; j < col; ++j){ 
     if(OriginalArray[i][j] == 8 ) { 
      // Found the correct i,j - print them or return them or whatever 
     System.out.println("{"+i+","+j+"}"); 
    System.out.println(); 
      a=i; 
      b=j; 
      break; 
     } 
    } 
} 

回答

1

你這樣做是對的,但break語句只退出內部循環。 您必須break from the outer loop才能維護索引。

對於懶:

int row=5; 
int col=7; 
int [][] OriginalArray = new int [row][col]; 

int a=0,b=0; 
outerLoop: 
for (int i = 0; i < row; ++i) { 
    for (int j = 0; j < col; ++j){ 
     if(OriginalArray[i][j] == 8 ) { 
      // Found the correct i,j - print them or return them or whatever 
      System.out.println("{"+i+","+j+"}"); 
      System.out.println(); 
      a=i; 
      b=j; 
      break outerLoop; 
     } 
    } 
} 
1

可以使用return,而不是break

for (int i = 0; i < row; ++i) { 
    for (int j = 0; j < col; ++j){ 
     if(OriginalArray[i][j] == 8 ) { 
      System.out.println("{"+i+","+j+"}"); 
      System.out.println(); 
      a=i; 
      b=j; 
      return; 
     } 
    } 
} 
+1

如果你把循環的方法裏面,這也是我認爲最好這個工作處理這種情況的方法 – Narmer

0

只需使用一組第一次插入整數返回true,當你插入設置已經包含返回false,對於第一次出現(就像納爾邁建議)的要求:

int row=5; 
    int col=7; 
    int [][] OriginalArray = new int [row][col]; 

    int a=0,b=0; 
    Set<Integer> duplicates = new HashSet<Integer>(); 
    outer: for (int i = 0; i < row; ++i) { 
     for (int j = 0; j < col; ++j){ 
      if (!duplicates.add(OriginalArray[i][j])) { 
       // Found the correct i,j - print them or return them or whatever 
       System.out.println("{"+i+","+j+"}"); 
         break outer; 
      } 
     } 
    } 

如果需要保存處理後的值只需更換了一個HashMap,象下面這樣:

int row=5; 
    int col=7; 
    int [][] OriginalArray = new int [row][col]; 

    Map<Integer, List<Pair<Integer, Integer>>> duplicates = new HashMap<Integer, List<Pair<Integer, Integer>>>(); 
    for (int i = 0; i < row; ++i) { 
     for (int j = 0; j < col; ++j){ 
      if (duplicates.containsKey(OriginalArray[i][j])) { 
       duplicates.get(OriginalArray[i][j]).add(new Pair(i,j)); 
      } else { 
       duplicates.put(OriginalArray[i][j], new ArrayList<Pair<Integer, Integer>>()); 
      } 
     } 
    } 

你需要創建Pair類這是一個簡單的類有兩個ttributes。

問候

+0

Map >>'Woah!對於一個簡單的任務來說,這是一個相當大的怪物......我相信你的工作原理,因爲我在分析它時想到了這一點。這應該是一個敲響的鐘...... – Narmer

+0

哈哈,如果你想保留所有重複它是一種方式:) – Deceiver

+0

如果你必須創建'Pair'類,爲什麼不讓它處理列表?然後它簡化了'Map '並且調用'duplicateates.get(OriginalArray [i] [j]).add(i,j);'。在'PairList'中,添加一個內部私有類'new Pair(i,j)'。再次,這是爲了可讀性。 – Narmer

0

保持可以使用,當我們滿足特定條件退出外環標誌

int row=5; 
int col=7; 
int [][] OriginalArray = new int [row][col]; 

int a=0,b=0; 
boolean found = false; 
for (int i = 0; i < row; ++i) 
{ 
    for (int j = 0; j < col; ++j) 
    { 
     if(OriginalArray[i][j] == 8 ) 
     { 
      // Found the correct i,j - print them or return them or whatever 
      System.out.println("{"+i+","+j+"}"); 
      System.out.println(); 
      a=i; 
      b=j; 
      found = true; 
      break; 
     } 
    } 
    if(found) 
    { 
    break; 
    } 
} 
相關問題