2015-09-12 29 views
10

我想比較兩個數組,如果至少一個值都可以在陣列中找到。比較兩個數組任何類似的價值

場景#1:2在兩個陣列中都找到,所以結果是true

String[] x = {"1","2","3"}; 
String[] y = {"2","5","6"}; 

方案#2:沒有匹配的值,所以結果是false

String[] x = {"1","2","3"}; 
String[] y = {"4","5","6"}; 

Java中是否有任何內置方法或任何可以處理此要求的庫?

我想強調的是,我要尋找一個Java庫,或者可以做到這一點的開箱任何Java方法。

Collection.contains是不是因爲兩個陣列中的所有值應爲返回true相同的選項。 (如果兩個陣列中至少有一個值相似,我需要返回true)

+0

你的嘗試是什麼? –

回答

2

此的任何元素可能有幫助。將打印語句更改爲true;如果你想。

for (int i = 0; i < x.length; i++) { 
    for (int j = 0; j < y.length; j++) { 
     if (x[i].equals(y[j])) { 
      System.out.println(x[i] + " is equal to " + y[j]); 
     } 
    } 
} 
4

看起來你在玩數組,所以我不打算在這裏使用任何魔法類。只是純粹的數組,你可以做

public boolean checkArrayEquals() { 
    String[] x = { "1", "2", "3" }; 
    String[] y = { "2", "5", "6" }; 
    for (int i = 0; i < x.length; i++) { 
     String xval = x[i]; 
     for (int j = 0; j < y.length; j++) { 
      if (xval.equals(y[j])) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
3

沒有內置的方法,但你可以寫,將使用Set,尋找符合你自己的實用方法。

private boolean sharesAnElement(String[] a, String[] b) { 
    Set<String> bSet = new HashSet<>(Arrays.asList(b)); 

    for (String str : a) { 
     if (bSet.contains(str)) { 
      return true; 
     } 
    } 

    return false; 
} 
2

解決方案可以是您可以迭代array1值並在每個元素的第二個數組中搜索。

public static void compareArrays(String[] array1, String[] array2) { 
    boolean b = false; 

    for(String str1 : array1){ 
     for(String str2 : array2){ 
      if(str1 == str1){ 
       b = true; 
       break; 
      } 
     } 
    } 
    System.out.println(b); 
} 

完整代碼:

public class HelloWorld{ 

    public static void main(String []args){ 
     String[] x = {"1","2","3"}; 
     String[] y = {"3","5","6"}; 
     compareArrays(x, y); 
    } 

    public static void compareArrays(String[] array1, String[] array2) { 
     boolean b = false; 

     for(String str1 : array1){ 
      for(String str2 : array2){ 
       if(str1 == str1){ 
        b = true; 
        break; 
       } 
      } 
     } 
     System.out.println(b); 
    } 
} 
8

您可以使用Collections#disjoint爲,

返回true如果兩個指定collection中 沒有相同的元素。

......

請注意,允許在兩個參數中傳遞相同的集合,在這種情況下,只有當集合爲空時,該方法纔會返回true。

boolean isNoCommonElements = Collections.disjoint(
             Arrays.asList(x), Arrays.asList(y)); 
3

這是一個相當特殊的需要,我不認爲任何流行的集合庫有一個特殊功能。你可以這樣做:

Collection<String> set = new HashSet<String>(Arrays.asList(x)); 
boolean result = false; 
for (String str: y) { 
    result |= set.contains(str); 
} 

其中有O(n)的複雜性,而不是通過兩個陣列迭代的爲O(n^2),並通過元素比較元素。

5

在Java 8中,您可以使用此:

String[] x = { "1", "2", "3" }; 
String[] y = { "2", "5", "6" }; 

Set<String> set = new HashSet<>(Arrays.asList(y)); 
boolean result = Arrays.stream(x).anyMatch(set::contains); // true 

這是O(n)

這是@Markus'答案的java 8版本,儘管anyMatch()在找到匹配時停止迭代。

注:如果xy長度是不同的,考慮具有更少的元件創建陣列周圍的流。這是因爲HashSet.contains()方法在O(1)攤銷時間內運行,與set的長度無關,所以對於最壞的情況,迭代次數更少會有更好的性能。