2010-10-21 58 views
6

Existe-t-il un moyen de vérifier si deux chaînes contiennent les mêmes caractères. Par exemple,Vérifier si 2 chaînes contiennent les mêmes caractères?

abc, bca -> true 
aaa, aaa -> true 
aab, bba -> false 
abc, def -> false 
+0

en double possible de [Vérifier si deux chaînes sont des permutations de l'autre] (http: // stackoverflow.com/questions/2131997/checking-if-two-strings-are-permutations-of-each-other-other) – finnw

Répondre

20

Transformez chaque chaîne en char [], triez ce tableau, puis comparez les deux. Simple.

private boolean sameChars(String firstStr, String secondStr) { 
    char[] first = firstStr.toCharArray(); 
    char[] second = secondStr.toCharArray(); 
    Arrays.sort(first); 
    Arrays.sort(second); 
    return Arrays.equals(first, second); 
} 
+0

... et supprimer les doublons es avant de comparer – testalino

+6

Non, si nous supprimions des doublons alors "aab, bba" retournerait vrai et il est spécifié comme renvoyant faux. – GaryF

+0

ouais, vous avez raison – testalino

1

Vous pouvez convertir la chaîne en tableau de caractères, trier les tableaux et les comparer les tableaux:

String str1 = "abc";     
String str2 = "acb"; 
char[] chars1 = str1.toCharArray(); 
char[] chars2 = str2.toCharArray(); 
Arrays.sort(chars1); 
Arrays.sort(chars2); 

if(Arrays.equals(chars1,chars2)) { 
     System.out.println(str1 + " and " + str2 + " are anagrams"); 
} else { 
     System.out.println(str1 + " and " + str2 + " are not anagrams"); 
} 
0

ici:

String str1 = "abc"; 
    String str2 = "cba"; 
    /* create sorted strings */ 

/* old buggy code 
    String sorted_str1 = new String(java.utils.Arrays.sort(str1.toCharArray())); 
    String sorted_str2 = new String(java.utils.Arrays.sort(str2.toCharArray())); 
*/  
/* the new one */ 
char [] arr1 = str1.toCharArray(); 
char [] arr2 = str2.toCharArray(); 
java.utils.Arrays.sort(arr1); 
java.utils.Arrays.sort(arr2); 
String sorted_str1 = new String(arr1); 
String sorted_str2 = new String(arr2); 

if (sorted_str1.equals(sorted_str2)) { 
     /* true */ 
    } else { 
     /* false */ 
    } 
+1

Arrays.sort (..) a un type de retour de void, donc vous ne pouvez pas l'utiliser directement dans le constructeur String. – GaryF

+0

vous avez raison. J'ai corrigé le code et posté à nouveau. –

6

très facile - mais pas très efficace - Pour ce faire, convertissez vos String s en tableaux char et utilisez java.util.Arrays.sort sur eux, obtenez String s en arrière et comparez pour l'égalité. Si vos chaînes ont moins de quelques milliers de caractères, cela devrait être très bien.

Si vous avez plusieurs chaînes de mégaoctets, vous pouvez créer un tableau avec un nombre pour chaque caractère (en utilisant son code comme index), avoir un passage sur une chaîne en ajoutant un sur le nombre de chaque caractère et un passer sur la deuxième chaîne en supprimant un. Si vous tombez sous 0 à n'importe quel moment au cours de la deuxième passe, ils n'ont pas les mêmes caractères. Lorsque vous avez terminé avec la deuxième chaîne sans erreur, vous êtes sûr qu'ils ont les mêmes caractères s'ils ont la même longueur (que vous auriez dû vérifier en premier).
Cette deuxième méthode est beaucoup plus compliquée que le tri des chaînes, et elle nécessite un grand tableau si vous voulez travailler avec des chaînes Unicode, mais c'est parfaitement bien si vous êtes d'accord avec seulement 128 caractères de l'ensemble ascii, et beaucoup plus rapide.
Ne vous embêtez pas avec ça si vous n'avez pas plusieurs millions de caractères dans vos chaînes. Le tri des chaînes est beaucoup plus facile, et pas beaucoup plus lent sur les chaînes avec seulement quelques dizaines de caractères.

+0

+1 pour souligner les avantages et les inconvénients de différentes solutions – sleske

3

En (tatillonne ;-)) Note de côté:

Soyez conscient que les solutions proposées ici ne fonctionnent que pour les chaînes composées de caractères de la Basic Multilingual Plane (BMP) d'Unicode.

caractères en dehors du BMP sont représentés comme paire de char dans un String, vous devez donc porter une attention particulière, de sorte que vous gardez les paires ensemble. Voir les Javadocs de java.lang.Character pour les détails sanglants.

Heureusement, la plupart des caractères en dehors du BMP sont plutôt exotiques. Même la plupart du japonais et du chinois est dans le BMP ...

+0

En fait, les solutions ici fonctionneront très bien en dehors du BMP. Le problème est qu'ils ne fonctionneront pas sur des chaînes non normalisées; le problème est que "é" peut être écrit comme un seul caractère ou une composition de "e" et un accent. (Ceci est un problème pour un certain nombre de langues européennes, et peu d'autres aussi.) –

+0

@ FellowsDonal: Comment peuvent-ils travailler en dehors du BMP? Un personnage de l'extérieur du BMP sera représenté comme une paire de substituts, c'est-à-dire comme deux 'char'. Si vous invoquez par ex. 'Arrays.sort (chars1)', la fonction de tri, qui ne connaît pas les substituts, va heureusement séparer les substituts et produire des données indésirables. Ou est-ce que je manque quelque chose? – sleske

+0

@ Fellows décernés: Bien sûr, vous avez raison de dire que le problème se produira aussi en combinant des caractères. Et BTW, en utilisant une chaîne normalisée ne suffit pas, car il existe plusieurs normalisations différentes, et certaines utilisent des caractères de combinaison. – sleske

1

Envisagez de créer une signature pour une chaîne donnée. Utiliser le nombre et le caractère.

a-count:b-count:c-count:.....:z-count: (extension en majuscules si vous le souhaitez).

Ensuite, comparez la signature. Cela devrait être mieux adapté aux très grandes chaînes.

En tant que raccourci, vérifiez la longueur. Si elles ne correspondent pas, renvoyez false de toute façon.

2

Peut-être que ce n'est pas la réponse la plus rapide, mais doit répondre le plus court.

boolean hasSameChar(String str1, String str2){ 
    for(char c : str1.toCharArray()){ 
    if(str2.indexOf(c) < 0) return false; 
    } 
    for(char c : str2.toCharArray()){ 
    if(str1.indexOf(c) < 0) return false; 
    } 
    return true; 
} 
0

ici:

import java.util.Arrays; 

CompareString public class {

String str = "Result"; 
String str1 = "Struel"; 

public void compare() { 
    char[] firstString = str.toLowerCase().toCharArray(); 
    char[] secondString = str1.toLowerCase().toCharArray(); 

    Arrays.sort(firstString); 
    Arrays.sort(secondString); 

    if (Arrays.equals(firstString, secondString) == true) { 
     System.out.println("Both the string contain same charecter"); 
    } else { 
     System.out.println("Both the string contains different charecter"); 
    } 
} 

public static void main(String[] args) { 
    CompareString compareString = new CompareString(); 
    compareString.compare(); 
} 

}