Esta es el arreglo más exacta que encomtrarás dar, pero primero mírala detenidamente y valora si se puede adaptar a tu trabajo.
Solución:
Todas estas soluciones parecen hacer mucho trabajo para una verificación relativamente simple, especialmente dada la API de flujo de Java 8:
/* Your lowercase string */.chars()
.filter(i -> i >= 'a' && i <= 'z')
.distinct().count() == 26;
Editar: para la velocidad
Si quieres acabar con la string iteración tan pronto como se encuentre todo el alfabeto mientras se siguen usando flujos, puede realizar un seguimiento con un HashSet
internamente:
Set chars = new HashSet<>();
String s = /* Your lowercase string */;
s.length() > 25 && s.chars()
.filter(i -> i >= 'a' && i <= 'z') //only alphabet
.filter(chars::add) //add to our tracking set if we reach this point
.filter(i -> chars.size() == 26) //filter the 26th letter found
.findAny().isPresent(); //if the 26th is found, return
De esta manera, la corriente cesará tan pronto como el Set
se llena con los 26 caracteres requeridos.
Hay algunas soluciones (incluso aún) más eficientes en términos de rendimiento a continuación, pero como nota personal, diré que no se atasque demasiado en la optimización prematura, donde podría tener legibilidad y menos esfuerzo al escribir el código real.
List.remove
elimina por índice. Desde un char
se puede convertir a un int, está eliminando efectivamente valores de índice que no existen, es decir, char 'a' es igual a int 97. Como puede ver, su lista no tiene 97 entradas.
Tu puedes hacer alphabet.remove(alphabets.indexOf(inp))
;
Como lo señaló @Scary Wombat (https://stackoverflow.com/a/39263836/1226744) y @Kevin Esche (https://stackoverflow.com/a/39263917/1226744), hay una mejor alternativa a su algoritmo
expresión regular es tu amigo. No es necesario usar un List
aquí.
public static void main(String[] args)
String s = "a dog is running crazily on the ground who doesn't care about the world";
s = s.replaceAll("[^a-zA-Z]", ""); // replace everything that is not between A-Za-z
s = s.toLowerCase();
s = s.replaceAll("(.)(?=.*\1)", ""); // replace duplicate characters.
System.out.println(s);
System.out.println(s.length()); // 18 : So, Nope
s = "a dog is running crazily on the ground who doesn't care about the world qwertyuioplkjhgfdsazxcvbnm";
s = s.replaceAll("[^a-zA-Z]", "");
s = s.toLowerCase();
s = s.replaceAll("(.)(?=.*\1)", "");
System.out.println(s);
System.out.println(s.length()); //26 (check last part added to String) So, Yes
Finalizando este artículo puedes encontrar las referencias de otros usuarios, tú asimismo tienes la libertad de mostrar el tuyo si te gusta.