2010-11-26 27 views
9

我有一組字符串[]。我想檢查這個Set是否包含另一個String []。檢查Java中的一組字符串中的遏制

Set<String[]> s = new HashSet<String[]>(); 
s.add(new String[] {"lucy", "simon"}); 
System.out.println(s.contains(new String[] {"lucy", "simon"})); 

但是,打印出錯誤。我的猜測是這是因爲只有引用被比較,而不是實際的字符串。看來,我唯一的選擇是創建一個班級,說短語,並實施hashCode()equals()(使用Arrays.hashCode(...))。

有沒有其他方法可以實現我想要的?

回答

13

你的猜測是正確的:陣列([])沒有實現深equals方法:他們是平等的,如果他們是相同的實例。

最簡單的解決辦法是:由List<String>

的其他方式替換String[](但我不建議這樣做)是爲了實現自己的套裝,它不基於Object.equalsjava.util.Arrays.equals(Object[]a, Object[]b)

+1

+1爲深等於解釋 – Barthelemy 2010-11-26 11:24:09

11

String[]轉換爲List<String>,它應該可以很好地工作。

Set<List<String>> s = new HashSet<List<String>>(); 
s.add(Arrays.asList("lucy", "simon")); 
System.out.println(s.contains(Arrays.asList("lucy", "simon"))); 
1

使用Set<Set<String>>Set<List<String>>代替Set<String[]>

代碼:

List<String> s1=Arrays.asList("1","2"),s2=Arrays.asList("1","2"); 
System.out.println(s1.equals(s2) + " "+s1.hashCode()+ " "+s2.hashCode()); 

輸出:

true 2530 2530 
1

聽起來像是你已經回答了你的問題。一種選擇正如你已經說過的。另一個辦法是使用集>,由於的equals(對象)說的API:

比較指定對象與此集合平等。

0

,我正通過環路和呼叫滿足Arrays.equals:

是這樣的:

boolean contains(Set<String[]> s, String[] item) { 
    for(String[] toCompare: s) { 
    if(Arrays.equals(toCompare, item)) { 
     return true; 
    } 
    } 
    return false; 
} 

不知道這是否是最快的,但它應該做的工作很好

3

String []的元素可以以不同的順序排列,並且仍然可以將整個數組視爲與另一個包含相同元素的另一個數組相同的順序?如果是的話,你確實會更好地實現一個容器類,並重寫equals和hashcode。

如果沒有,並且如果存儲所述內部元件作爲解釋,而不是陣列是可以接受的替代,則可以做到這一點:

package com.stackoverflow; 


import java.util.Arrays; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 


public class StringContainment { 

    public static void main(final String[] args) { 
    final Set<String[]> s = new HashSet<String[]>(); 
    final Set<List<String>> s2 = new HashSet<List<String>>(); 

    s.add(new String[] {"lucy", "simon"}); 
    s2.add(Arrays.asList(new String[] { "lucy", "simon" })); 

    System.out.println(s.contains(new String[] {"lucy", "simon"})); // false 
    System.out.println(s2.contains(Arrays.asList(new String[] {"lucy", "simon"}))); // true 
    } 

} 

第一檢查將返回false,第二真。 如果您可以使用列表,可能會更容易。

如果你不能,那麼只要你不需要太頻繁地進行這種比較(這在性能方面絕對不是一個好主意)。

0

隨着Java8流的介紹,你可以做到這一點通過以下方式:

Boolean res = s.stream() 
    .anyMatch(elm -> elm.equals("lucy") || elm.equals("simon"));