Quiero tener una función para construir una cadena a partir de caracteres ingresados y detener la construcción si obtiene un carácter de entrada que contiene.
Sé que puedo usar String.contains() para esto, pero estoy aprendiendo sobre HashMaps y me pregunto si una forma más rápida de hacerlo podría ser almacenar los caracteres ingresados en un HashMap y usar el método HashMap.contains() .
HashMap::containsKey es O(1) , String::contains no lo es . La implementación puede cambiar según la versión de JVM, pero es más como O (n).
Entonces, sí, usar un HashMap para buscar un valor debería ser más rápido (en datos pequeños probablemente no notará la diferencia) que llamar a String::contains . Pero un Map almacena una clave y un valor, si no le importa el valor, puede usar un Set (tenga cuidado, todos los valores son únicos en este tipo de colección) porque Set::contains es O(1) .
Como @ n247s mencionado en el comentario. Excepto si realmente tiene un problema de rendimiento, String::contains debería funcionar bien y hacer que el código sea más fácil de leer.
Un Set sería una buena estructura de datos para usar aquí.
Sin embargo, solo toma nota de 1 cosa,
Si necesita una búsqueda que distinga case-sensitive , puede usar un HashSet . Ejemplo
Set<String> set = new HashSet<>(); De lo contrario, si necesita una búsqueda que no distinga case-insensitive entonces un TreeSet . Ejemplo
Set<String> set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);HashMap<> es solo una clase que amplía la interfaz Map<> , puede usar containsKey() o containsValue() . Si desea recorrer los valores en HashMap , puede usar el método HashMaps.values() y combinar/agregar el valor a String.
NO PROBADO:
int count = -1; String new = ""; for (char c : map.values()) { count++; if (string.charAt(count).equals(c)) break; new.concat(c); }