jueves, 17 de noviembre de 2011

Búsqueda de letras faltantes del abecedario en una oración


Creo que siempre es bueno salvar cualquier código que uno haya hecho por más simple o trivial que parezca. Puede ser que en el momento menos esperado lo requiramos y realmente es frustrante acordarse de que ya uno lo había hecho y luego desechado a la basura.

Dejo para el historial un pequeño código que hice como parte del proceso para aplicar a una empresa. El planteamiento es simple. Codificar un programa que busque las letras faltantes del abecedario en una oración.

import java.util.HashSet;
import java.util.Set;

/**
* Test code to find missing letters of the alphabet from a String sentence.
* @author gabriel.solano
*
*/
public class MissingLetters {

private final int ASCII_CODE_FOR_LETTER_A = 97;
private final int ASCII_CODE_FOR_LETTER_Z = 122;

/**
* Gets the missing letters of a sentence in lower case.
* @param sentence
* @return String having all the letters that the sentence is missing from the alphabet.
*/
public String getMissingLetters(String sentence){
/*
* 1. Let's populate a set with the unique characters of the sentence.
* This approach avoids having two nested for's in the code (better performance).
*/
Set<Integer> uniqueASCIICodes = new HashSet<Integer>();

for (char character : sentence.toLowerCase().toCharArray() ) {
if (character >= ASCII_CODE_FOR_LETTER_A
&& character <= ASCII_CODE_FOR_LETTER_Z) { // Range of lower case letters.
uniqueASCIICodes.add((int)character);

if (uniqueASCIICodes.size() == 26) {
break; // Sentence already covered all letter from the alphabet.
}
}
}
/*
* 2. Move in the range of ascii codes of lower case alphabet
* and check if letter was present in sentence.
*/
StringBuilder misingLettersBuilder = new StringBuilder();

for (int i=ASCII_CODE_FOR_LETTER_A; i <= ASCII_CODE_FOR_LETTER_Z; i++) {
if (!uniqueASCIICodes.contains(i)) {
misingLettersBuilder.append((char)i);
}
}
return misingLettersBuilder.toString();
}

public static void main(String[] args) {

String case1 = "A quick brown fox jumps over the lazy dog";
String case2 = "bjkmqz";
String case3 = "cfjkpquvwxz";
String case4 = "";

MissingLetters missingLetters = new MissingLetters();

System.out.println("Missing letters for[" + case1 + "]: " +
missingLetters.getMissingLetters(case1));
System.out.println("Missing letters for[" + case2 + "]: " +
missingLetters.getMissingLetters(case2));
System.out.println("Missing letters for[" + case3 + "]: " +
missingLetters.getMissingLetters(case3));
System.out.println("Missing letters for[" + case4 + "]: " +
missingLetters.getMissingLetters(case4));
}
}

Salida del programa:

Missing letters for[A quick brown fox jumps over the lazy dog]:
Missing letters for[bjkmqz]: acdefghilnoprstuvwxy
Missing letters for[cfjkpquvwxz]: abdeghilmnorsty
Missing letters for[]: abcdefghijklmnopqrstuvwxyz

1 comentario:

  1. Al margen de esto, seria interesante definir una especie de coleccion que puede aplicarsele un not o diff entre otras operaciones de conjunto definidos en un universo (un intervalo), en este caso algo como:

    Set set = new SmartSet (97.. 122);

    Set newDiffSet = set.diff (userSequenceCharSet);

    Tuanis,
    J

    ResponderEliminar