2015-09-12 81 views
10

Vorrei confrontare due array, se è possibile trovare almeno un valore su entrambi gli array.Confronto di due array per qualsiasi valore simile

Scenario # 1:2 si trova in entrambe le matrici, quindi il risultato è true.

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

Scenario # 2: Nessun valore corrispondente, in modo che il risultato è false.

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

Esiste un metodo integrato in Java o una libreria in grado di gestire questo requisito?

Vorrei sottolineare che sto cercando una libreria Java o qualsiasi metodo Java che possa farlo immediatamente.

Il Collection.contains non è un'opzione in quanto tutti i valori in entrambi gli array devono essere uguali per restituire true. (Devo restituire true se almeno un valore è simile in entrambi gli array)

+0

Qual è il tuo tentativo? –

risposta

2

Questo potrebbe aiutare. Modificare l'istruzione di stampa per restituire true; se vuoi.

4

Sembra che tu stia giocando con gli array, quindi non userò alcuna lezione di Magic qui. Basta con gli array puri, si può fare

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

Non c'è una costruito nel metodo, ma è possibile scrivere il proprio metodo di utilità che utilizzerà un Set e cercare corrispondenze.

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

soluzione può essere che si può scorrere matrice1 valore e la ricerca nel secondo array con ogni elemento.

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); 
} 

completo del codice:

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

È possibile utilizzare Collections#disjoint per questo,

Restituisce vero se le due collezioni specificati non hanno elementi in comune.

...

Si noti che è consentito passare la stessa raccolta in entrambi i parametri, nel qual caso il metodo restituirà true se e solo se la raccolta è vuota.

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

Questa è una necessità piuttosto specifica e non credo che una qualsiasi delle librerie di raccolta popolare ha una funzione speciale per questo. Si potrebbe fare:

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

Che ha O (n) la complessità piuttosto che la O (n^2) di iterazione attraverso entrambi gli array e confrontare elemento per elemento.

5

In Java 8, è possibile utilizzare questo:

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 

quali è O(n).

Questa è la versione java 8 della risposta di @Markus, sebbene anyMatch() interrompa l'iterazione quando viene trovata una corrispondenza.

NOTA: Sex e y lunghezze sono diverse, considerare creando il flusso attorno alla matrice con meno elementi. Questo perché il metodo HashSet.contains() viene eseguito nel tempo ammortizzato O(1), indipendentemente dalla lunghezza di set, quindi, nel peggiore dei casi, l'iterazione di meno tempo ha prestazioni migliori.