2017-03-24 90 views
-1

我有兩個HashSet<String>刪除重複使用正則表達式表達

Set<String> test = new HashSet<>(); 
test.add("LON/912"); 
test.add("LON/914"); 
test.add("LON/916"); 

Set<String> test1 = new HashSet<>(); 
test1.add("912"); 

我有比較兩組從測試設置這樣決勝盤刪除重複912將是

[{LON/914},{LON/916}] 

我不想使用嵌套的for-loops進行比較,因爲它不是執行有效的,我們可以使用regex expression還是其他什麼來實現這一目標?

+0

集合不包含重複項。這是一個集合的定義。或者你是否想要刪除這兩組中存在的元素? – Michael

回答

1

您可以使用removeAll刪除所有存在於另一個集合中的元素。

Set<String> first = new HashSet<>(); 
first.add("LON/912"); 
first.add("LON/914"); 

Set<String> second = new HashSet<>(); 
second.add("LON/912"); 

first.removeAll(second); // first now only contains "LON/912" 

如果你的字符串是完全相等的,但它們不是這樣就足夠好了。一個簡單的解決方法是將「LON /」附加到進入第二組的每個字符串中。

如果無法實現,則需要更具創造性:您可以使用自定義的equals運算符添加單獨的類。

class MyString 
{ 
    public String str; 
    MyString(String str) 
    { 
     this.str = str; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) return true; 
     if (obj == null) return false; 
     if (getClass() != obj.getClass()) return false; 

     final MyString other = (MyString) obj; 

     if (this.str.contains("LON/")) 
     { 
      return this.str.endsWith(other.str); 
     } 
     else 
     { 
      return this.str.equals(other.str); 
     } 
    } 
} 

,並作出一系列的這些:

Set<MyString> foo = new HashSet<>(); 

然後使用removeAll正如我所提到。

請注意,MyString類的上述實現僅代表您需要實現的內容。這當然不完整,並且至少應該包含哈希碼實現。

+0

我猜OP的問題在於字符串值不是真的等於「LON/912」而只是「912」,所以不能用'removeAll'方法。你需要一個自定義的比較器 – xander

+0

@xander是的,我注意到了。我懷疑它可能是一個錯字,但如果它不是我已經添加了一點額外的答案。 – Michael

+0

也許,但如果這是一個錯字OP爲什麼要求一個正則表達式來比較這些值,如果字符串是平等的,這是沒有意義的,但是誰知道:D – xander