2014-02-25 215 views
0

我真的需要比較二維數組的幫助。 在情況下,我有陣列的以下值:Java比較二維數組

  • dok1 [paragraf] [kalimat]
  • DOK2 [paragraf] [kalimat]

* dok1

[0][0] = Deskripsi Hotel 

[1][0] = PETIK HOTEL 


[2][0] = Pelayanan yang ramah juga diberikan di hotel ini 


[2][1] = Lembang no 24 


[2][2] = hotel ini berdiri pada tahun 1994 

[3][0] = Gambar Template/layout pada website ini 

* dok2

[0][0] = Banyak penjual kerudung di jalan keluar pabrik 

[1][0] = Di sisi-sisi penjual itu juga nampak seperti penjual kurma dan buah dadakan 

[1][1] = Penjual makanan juga memenuhi trotoar jalan, yang sebagian besar adalah penjual dadakan 

[1][2] = Mulai dari menu takjil hingga makanan berbuka puasa tersedia disini 



[2][0] = Belum lagi penjual pakaian yang memanjang hingga ujung jalan 

[3][0] = Kerumunan pedagang tersebut makin membuat lalu lintas padat 

我需要比較它們以便計算字符串元素之間的相似性。它應該是這樣的:

[0][0] vs [0][0] 

[0][0] vs [1][0] 

[0][0] vs [1][1] 

[0][0] vs [1][2] 

[0][0] vs [2][0] 

[0][0] vs [3][0] 

等等。

我試圖使用4個嵌套循環,

for (int i = 0; i < dok1.length; i++) { 
       for (int j = 0; j < dok1[i].length; j++) { 
        for (int k = 0; k < dok2.length; k++) { 
         for (int l = 0; l < dok2[k].length; l++) { 

但結果是,如下:

[0][0] vs [0][0] 

[0][0] vs [1][0] 

[0][0] vs [2][0] 

[0][0] vs [3][0] 

[1][0] vs [0][0] 

[1][0] vs [1][0] 

[1][0] vs [2][0] 

[1][0] vs [3][0] 

等。

很明顯,dok2中kalimat的數組元素仍爲0,它們甚至沒有增加。我在循環方法中做錯了什麼?有沒有人有更好的方法?謝謝.. :)

+0

你想如何衡量元素之間的相似性?這怎麼會變成數組之間的比較呢?你想如何表示結果?你想比較相應的元素,還是想比較一個數組的每個元素與另一個數組的所有元素? –

+0

我使用我自己的方法使用Levenshtein距離算法。但這不是我在這個問題上關心的事情。我只想要如何比較一個數組的每個元素與另一個數組的所有元素。無需使用任何條件,如if或if-else。只需將所有流程打印出來,我就可以看到流程的進展情況。如果你可以提供這樣的方法,我會非常感激.. :) – asubanovsky

回答

1

我懷疑你原來的循環是正確的,但你必須在最裏面的循環體一個下標錯誤。但是,循環效率低下,因爲您要重複計算內循環中的數組訪問表達式,這些表達式對於外循環的每次迭代都是不變的。您可以加快代碼(和儘量減少下標錯誤的風險),還有一些臨時變量:

for (int i = 0; i < dok1.length; i++) { 
    final String[] row1 = dok1[i]; 
    for (int j = 0; j < row1.length; j++) { 
     final String item1 = row1[j]; 
     for (int k = 0; k < dok2.length; k++) { 
      final String[] row2 = dok2[k]; 
      for (int l = 0; l < row2.length; l++) { 
       final String item2 = row2[l]; 
       // compare item1 (== dok1[i][j]) with item2 (== dok2[k][l]) 
      } 
     } 
    } 
} 

如果您不需要索引本身(只是String每個數組元素值),可以使用一個enhanced for loop用簡單的代碼完成相同的循環:

for (final String[] row1 : dok1) { 
    for (final String item1 : row1) { 
     for (final String[] row2 : dok2) { 
      for (final String item2 : row2) { 
       // compare item1 with item2 
      } 
     } 
    } 
} 
+0

恩,謝謝你的回答.. :) – asubanovsky

1

你必須同時走兩個數組,而不是四個嵌套循環。

assert dok1.length == dok2.length 
int firstDimension = dok1.length; 

for (int i = 0; i < firstDimension; i++) { 
    assert dok1[i].length = dok2[i].length; 
    int secondDimension = dok1[i].length; 

    for (int j = 0; j < secondDimension; j++) { 
     // Comparing 
    } 
} 
+0

結果並不如我所料。但謝謝你的迴應。 – asubanovsky

1
  int similarCounter=0; 
      for(int i=0;i<paragraf;i++){//paragraf is dok1.length 
       for (int j = 0; j < kalimat; j++) {//kalimat is dok1.width 
        if((dok1[i][j]).equals(dok2[i][j])){//replace it with your codition of comparison 
         System.out.println("Similar ("+i+","+j+")"); 
         similarCounter++; 
        } 
       } 
      } 
      System.out.println("There are tolally "+similarCounter+" similar!"); 
+0

結果並非如我所料。但謝謝你的迴應。 – asubanovsky