2014-09-26 67 views
-1

下面的代碼執行以下操作:在「A」的每個元素,尋找是否有匹配的元素「B」:新到Java - 代碼列出重複需要優化

String a[] = new String[]{"a","b","c"}; 
String b[] = new String[]{"e","f","a","a"}; 
String hold=""; 

for (int i = 0; i < a.length; i++){ 


for (int k = 0; k < b.length; k++){ 

    if (a[i].equals(b[k]) ){ 
     hold+=a[i]; 

    }//if 

}//for 


}//for 

問題有時陣列'b'可以包含重複項,但我們不希望 重複項被記錄在變量'hold'中

以下是我試過的 - 將所有匹配項保存到HashSet,然後使用containsKey )到第一個 檢查它是否在hashset中,如果沒有,則更新'hold'變量。還嘗試記錄陣列中的每個匹配,並在更新'保持'變量之前首先檢查該陣列

是否有另一種方法可以做到這一點?有沒有更好的方法來做到這一點?

回答

1

所以你離開了,只要你得到匹配的對象添加休息

for (int k = 0; k < b.length; k++){ 

    if (a[i].equals(b[k]) ){ 
     hold+=a[i]; 
     break; 
    }//if 

}//for 

編輯:

如果你想阻止對方太像這樣做:

start: 
    for (int i = 0; i < a.length; i++){ 


     for (int k = 0; k < b.length; k++){ 

      if (a[i].equals(b[k]) ){ 
       hold+=a[i]; 
       break start; 
      }//if 

     }//for 


    }//for 

編輯

如果你想確保你沒有得到的「一」重複這樣做:

String a[] = new String[]{"a", "b", "c"}; 
String b[] = new String[]{"e", "f", "a", "a"}; 
List<String> matches = new ArrayList<String>(); 

String hold = ""; 

for (String anA : a) 
    if (!matches.contains(anA)) 
     for (String aB : b) 
      if (anA.equals(aB)) 
      { 
       hold += anA; 
       matches.add(anA); 
      }//if 
    }//for 


}//for 
+0

看起來不錯,但如果重複的陣列存在「一」? – 2014-09-26 15:49:12

+0

編輯我的答案。添加一個標籤並中斷您定義的標籤。 – 2014-09-26 15:59:09

+0

此外,如果你要檢查是否有'a'中的重複,那麼一個for不是最好的解決方案,你應該使用其他人在這裏已經顯示的其他人:) – 2014-09-26 16:05:01

0

您應該考慮使用a Set您保持變量,以便它不包含重複,並使用retainAll方法來獲取集合和另一個集合(可以包含重複項)之間的交集。

0

我會將它們轉換爲列表並使用retainAll來查找匹配項。然後只是循環你的舉行var的列表。您不必擔心使用此方法的b中的重複項。 retainAll不會在乎它在b中兩次。它會保留一個,因爲它存在於b中。無論數組中剩下什麼,都會連接到您的保留狀態。

String a[] = new String[]{"a","b","c"}; 
String b[] = new String[]{"e","f","a","a"}; 

//get new ArrayList because asList is immutable 
List<String> aList = new ArrayList(Collections.asList(a)); 
List<String bList = Collections.asList(b); 

aList.retainAll(bList); 
StringBuilder sb = new StringBuilder(); 
for(String s : aList) { 
    sb.append(s); 
} 

String hold = sb.toString(); 
+0

是的,這基本上是我之前提到的代碼片段。 gj :) – Javier92 2014-09-26 15:55:13

0

使用套件會自動刪除重複項。

Set<String> mySet1 = new HashSet<String>(Arrays.asList(a)); 
Set<String> mySet2 = new HashSet<String>(Arrays.asList(b)); 

mySet1mySet2將不包含任何重複。 根據你的例子mySet1{"a","b","c"}mySet2{"e","f","a"}

這個地步,你想檢查this文檔,你可以使用多種方法來獲取後。 我相信你正在尋找removeAll函數。

-1

那麼,我看到你在做什麼,你有2個數組與內容在它。我知道未來的內容將會有所不同。每次迭代數組A的1個字符時,都要測試數組B是否具有相同的值。如果是這樣,你想要將該值存儲在數組/字符串Hold中。

爲什麼不只是檢查保持,如果該值已經存在,如果沒有,添加它,如果是這樣,跳過它?

PS:抱歉,我沒有在評論中這樣做,但我沒有足夠的代表評論問題本身。

0

使用的java.util.List很簡單:

List<String> listB = new LinkedList(); 
    for(int i = 0; i < b.lenght; i++) listB.add(b[i]); 
    for(int i = 0; i < a.lenght; i++) { 

     if(listB.contains(a[i])) hold+=a[i]; 
    }