¿Hay alguna forma de comprobar si dos cadenas contienen los mismos caracteres? Por ejemplo,Comprobando si 2 cadenas contienen los mismos caracteres?
abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
¿Hay alguna forma de comprobar si dos cadenas contienen los mismos caracteres? Por ejemplo,Comprobando si 2 cadenas contienen los mismos caracteres?
abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false
Convierta cada cadena en un char [], ordene esa matriz y luego compare los dos. Sencillo.
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);
}
puede convertir la cadena en matriz de caracteres, ordenar los arrays y los compare las matrices:
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");
}
aquí:
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 */
}
Arrays.sort (..) tiene un tipo de retorno de vacío, por lo que no puede usarlo directamente en el constructor de cadenas. – GaryF
tienes razón. He corregido el código y publicado de nuevo. –
Un muy fácil - pero no muy eficiente - La forma de hacerlo es convertir sus String
a arreglos de caracteres y usar java.util.Arrays.sort en ellos, obtener String
s a la vuelta y comparar por igualdad. Si sus cadenas tienen menos de unos miles de caracteres, eso debería estar muy bien.
Si tiene varias cadenas de megabytes, puede crear una matriz con un recuento para cada carácter (usando su código como índice), tener una pasada en una cadena y agregar una en el recuento de cada char, y pasa la segunda cuerda quitando una. Si caes por debajo de 0 en cualquier punto durante el segundo pase, no tienen los mismos caracteres. Cuando hayas terminado con la segunda cadena sin error, estás seguro de que tienen los mismos caracteres si tienen la misma longitud (que deberías haber verificado primero de todos modos).
Este segundo método es mucho más complicado que ordenar las cadenas, y requiere una gran matriz si quieres trabajar con cadenas unicode, pero está perfectamente bien si estás bien con solo los 128 caracteres del conjunto ascii, y mucho Más rápido.
NO te molestes con eso si no tienes varios millones de caracteres en tus cadenas. Ordenar las cadenas es mucho más fácil, y no significativamente más lento en cadenas con solo un par de docenas de caracteres.
+1 para señalar los pros y los contras de las diferentes soluciones – sleske
Como (nitpicking ;-)) nota:
Tenga en cuenta que las soluciones propuestas aquí sólo funcionan para las cadenas compuestas por caracteres de la Basic Multilingual Plane (BMP) de Unicode.
caracteres fuera del BMP se representan como un par de char
en un String
, por lo que es necesario prestar una atención especial, por lo que mantener los pares juntos. Vea los Javadocs de java.lang.Character
para los detalles sangrientos.
Afortunadamente, la mayoría de los caracteres fuera del BMP son bastante exóticos. Incluso la mayoría de los japoneses y chinos están en el BMP ...
En realidad, las soluciones aquí funcionarán fuera del BMP muy bien. El problema es que no funcionarán en cadenas no normalizadas; el problema es que "é" puede escribirse como un solo carácter o una composición de "e" y un acento. (Este es un problema para varios idiomas europeos, y algunos otros también). –
@Fellows Digitales: ¿Cómo pueden funcionar fuera del BMP? Un personaje de fuera del BMP se representará como un par de sustitutos, es decir, como dos 'char'. Si invocas, por ejemplo, 'Arrays.sort (chars1)', la función de ordenación, que no sabe de sustitutos, desgarrará felizmente los sustitutos y producirá datos basura. ¿O me estoy perdiendo algo? – sleske
@Donal Fellows: Pero, por supuesto, tienes razón en que el problema también ocurrirá con la combinación de caracteres. Y por cierto, usar una cadena normalizada no es suficiente, porque hay varias normalizaciones diferentes, y algunas usan caracteres combinados. – sleske
Considere crear una firma para un String determinado. Usando conteo y personaje.
a-count:b-count:c-count:.....:z-count:
(extiéndase para mayúsculas si lo desea).
Luego compare la firma. Esto debería escalarse mejor para cuerdas muy grandes.
Como atajo, verifique la longitud. Si no coinciden, devuelve falso de todos modos.
Tal vez no sea la respuesta más rápida, pero debe ser la respuesta más breve.
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;
}
aquí:
import java.util.Arrays;
public class {CompareString
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();
}
}
posible duplicado de [Comprobación de si dos cadenas son permutaciones de unos a otros] (http: // stackoverflow.com/questions/2131997/checking-if-two-strings-are-permutations-of-eachother) – finnw