La forma humana:
iterar sobre la primera matriz, la comprobación de la existencia de cada elemento en la segunda matriz, y luego hacer lo mismo para la segunda matriz en la primera matriz. Tiempo: n^2. Tenga en cuenta que este método supone que no se repite ningún elemento. Si lo fuera, deberías, para cada elemento que estás comprobando, volver al principio y contar cuántas instancias de ese elemento hay, (decir X), y solo contar un éxito como encontrar el X elemento en el segundo conjunto. Hacer esto eliminaría la necesidad del segundo control, y se lo dejaría como ejercicio al lector (si así lo desea, es decir.)
boolean equal(String[] arr1, String[] arr2) {
if(arr1.length != arr2.length) return false; // obviously
main_loop:
for(int i = 0; i < arr1.length; i++) {
for(int j = 0; j < arr2.length; j++) {
if(arr1[i].equals(arr2[j]))
break main_loop;
}
return false;
}
main_loop:
for(int i = 0; i < arr2.length; i++) {
for(int j = 0; j < arr1.length; j++) {
if(arr2[i].equals(arr1[j]))
break main_loop;
}
return false;
}
// having got through both loops, we can now return true
}
una forma más avanzada: ordenar ambas matrices y caminar sobre los dos. Tiempo: n lg n
boolean equals(String[] arr1, String[] arr2) {
if(arr1.length != arr2.length) return false;
String[] copy1 = Arrays.copyOf(arr1,arr1.length); // java.util.Arrays
String[] copy2 = Arrays.copyOf(arr2,arr2.length); // java.util.Arrays
Arrays.sort(copy1);
Arrays.sort(copy2);
for(int i = 0; i < copy1.length; i++) {
if(!copy1[i].equals(copy2[i])
return false;
}
return true;
}
Una forma aún más avanzada: utilizar un HashMap, añadiendo para los cargos de la primera matriz de cadenas, la eliminación de los recuentos de la segunda matriz de cadenas. Cuando eres odne, todos los recuentos deben ser cero.
boolean equal(String[] arr1, String[] arr2) {
if(arr1.length != arr2.length) return false;
Map<String, Integer> map1 = new HashMap<String,Integer>();
for(String str : arr1) {
if(!map.containsKey(str)) {
map.put(str, 1);
} else {
map.put(str, map.get(str) + 1); // add to count inthe map
}
}
for(String str : arr1) {
if(!map.containsKey(str)) {
return false; // we have an element in arr2 not in arr1 - leave now
} else {
map.put(str, map.get(str) - 1); // remove to count inthe map
}
}
for(Integer count : map.values()) {
if(count.intValue() != 0) return false;
}
return true;
}
Gran solución :) – Popokoko
@ManojGumber Yo también creo que es una gran solución. –
Estoy de acuerdo con eso, pero supongo que la complejidad sería 2N + N^2, que es equivalente a N^2 que no puedo evitar, ¿no? – Popokoko