2010-08-23 18 views
5

La mia domanda è che ho 2 stringhe, ad esempio String1 & String2. Ora voglio verificare se queste 2 stringhe contengono gli stessi caratteri o meno, indipendentemente dalla loro sequenza.Come confrontare 2 stringhe contenenti gli stessi caratteri

Supponiamo String1= "qwerty", String2= "qywter". Ora queste stringhe contengono gli stessi caratteri ma sono in sequenza diversa. Quindi c'è qualche funzione che può essere usata per mostrare che queste stringhe contengono gli stessi caratteri ?? Il metodo equals() può farlo ???

Tutto l'aiuto è apprezzato.

+6

Che dovrebbe essere il risultato nel caso in cui essi hanno gli stessi personaggi, ma non lo stesso numero di caratteri? (Come "qwerty" e "qywtery"?) Contengono gli stessi caratteri, ma non lo stesso numero di caratteri. – MikeTheReader

risposta

17
char[] chars1 = string1.toCharArray(); 
char[] chars2 = string2.toCharArray(); 
Arrays.sort(chars1); 
Arrays.sort(chars2); 

return Arrays.equals(chars1, chars2); 
+1

ma cosa restituiscono ??? – prasad

+0

@prasad - Non ho capito il tuo commento – Bozho

+0

Intendo dire "restituisci Arrays.equals (chars1, chars2);" dichiarazione restituisce un valore booleano o un int ?? – prasad

2

È possibile utilizzare String.equals, anche se indirettamente. In primo luogo è necessario un metodo di supporto:

// given a String, sorts its chars and return it as another String 
public static String sorted(String s) { 
    char[] arr = s.toCharArray(); 
    Arrays.sort(arr); 
    return new String(arr); 
} 

allora si può avere:

String s1 = "qwerty"; 
    String s2 = "qywter"; 

    System.out.println(sorted(s1)); // eqrtwy 

    System.out.println(sorted(s1).equals(sorted(s2))); // true 

Nota che questo non è l'algoritmo più efficiente - è O(N log N) tempo, e utilizza lo spazio estraneo - ma dovrebbe funzionare bene per le corde corte. Per le stringhe lunghe, dovresti passare attraverso ogni char (o punti di codice Unicode) manualmente (invece di toCharArray()), e forse usare il tempo lineare counting sort.

Se non si cura di carattere specifico che conta corrispondenza (ad esempio "xxxyyy" e "xy" ha gli stessi caratteri, anche se in numeri diversi), quindi è possibile utilizzare una rappresentazione set-simile (java.util.BitSet).

// given a string, returns its used char set as a java.util.BitSet 
public static BitSet usedChar(String s) { 
    BitSet bs = new BitSet(); 
    for (int i = 0; i < s.length(); i++) { 
     bs.set(s.charAt(i)); 
    } 
    return bs; 
} 

allora si può avere:

System.out.println(
     usedChar("xxxyyy").equals(usedChar("xy")) 
    ); // true 

    System.out.println(
     usedChar("xyz").equals(usedChar("abc")) 
    ); // false 
2

Dipende se si vuole realmente caratteri o si vuole veramente punti di codice, e quindi è importante se si vuole contare i duplicati o meno. Ecco una soluzione:

public class a { 
    public static void main(String[] args) { 
    String s1 = "qwerty"; 
    String s2= "qywter"; 
    System.out.println(codePointSet(s1).equals(codePointSet(s2))); 
    } 
    public static Set<Integer> codePointSet(String s) { 
    Set<Integer> set = new TreeSet<Integer>(); 
    for (int i = 0, cp; i < s.length(); i += Character.charCount(i)) { 
     cp = s.codePointAt(i); 
     set.add(cp); 
    } 
    return set; 
    } 
} 
0

String.equals() non funziona per il vostro caso particolare. Probabilmente dovrai scrivere il tuo metodo per equiparare le stringhe in questo modo.

1
int[] f = new int[(int)char.MaxValue]; 
foreach (var c in string1) f[(int)c]++; 
foreach (var c in string2) f[(int)c]--; 
return f.Max() == 0 && f.Min() == 0; 

Questa è la soluzione preferibile quando string1.length() >> char.MaxValue ed ha basso grande complessità O notazione.

EDIT questo è in realtà codice C# ma è possibile ottenere facilmente risultati simili in Java.

+0

Un approccio interessante, anche se certamente non Java. –

0

Se si dispone di una lunga serie che è necessario confrontare, e non hai bisogno di una garanzia di successo, si può fare qualcosa di simile:

  1. assicurarsi che le stringhe sono della stessa lunghezza
  2. per ogni immagine
  3. si sommano tutti i personaggi (fuso come interi)
  4. aggiungere fino piazze di caratteri (ancora una volta colato come int)
  5. confrontare le somme dei quadrati e le somme
  6. se sono uguali, quindi le stringhe contengono gli stessi caratteri.

In realtà ho passato un po 'di tempo a cercare di capire dove questo non avrebbe funzionato, ma non riesco a pensarne uno. Il mio istinto mi dice che mi manca qualcosa qui, o questo è un buon comparatore per questo caso.

0

Due passi sono richiedono

  1. fare XOR di entrambe le stringhe e se XOR è 0 allora si sono parzialmente sicuro.

  2. Se XOR è 0 poi trovare la somma del valore ASCII di entrambe le stringhe e se somma ASCII è lo stesso allora entrambe le stringhe sono gli stessi.

Spero che questo aiuti

Problemi correlati