Realmente esta é uma das soluções, mais não posso usa-la. Pois não vi hash map na faculdade. E colar isto no programa seria uma tremenda cara de pau com o professor.
o Código que resolve o prolema é este abaixo:
package Exe0403;
import java.util.*;
public class teste {
public static void main(String[] args)
{
HashMap<Character, Integer> h = new HashMap<Character, Integer>();
String s = "teste";
String unique = new String();
for ( int i = 0; i < s.length(); i++ ) {
if ( h.containsKey ( s.charAt ( i ) ) ) {
h.put ( s.charAt ( i ), (int)h.get ( s.charAt ( i ) ) + 1 );
} else {
h.put ( s.charAt ( i ), 1 );
unique += s.charAt ( i );
}
}
Set<Map.Entry<Character, Integer>> freq = h.entrySet();
Iterator<Map.Entry<Character, Integer>> it = freq.iterator();
while ( it.hasNext() ) {
Map.Entry<Character, Integer> item = it.next();
System.out.println ( item.getKey() + ": " + item.getValue() );
}
}
}
Saída:
e: 2
t: 2
s: 1
Pude reparar que saiu meio que invertido a ordem das letras, mas funcionou.
Enquanto isso estou analisando o codigo pra ver se adapto isto a este for do meu código la do começo da página que mostra a saída.
for (int i = 0; i < carac.length; i++) {
if (carac[i] != 0) {
System.out.println(" " + carac[i] + " - " + contagem[i] + " ");
}
}
É este laço que tem que mostrar a saída corretamente sem repetir as letras ja mostradas.
É que utilizando List<String key, Object object> você simplesmente verificaria se a chave é igual ao objeto da letra desejada e, assim, poderia incrementar o objeto.
A lógica que você postou está péssima. Ela faz uso de funções caríssimas, como a indexOf.
Normalmente, para contar caracteres, o que devemos fazer é lembrar que cada letra é associada a um código ascii. Portanto, é fácil calcular diretamente o índice dela em relação a um vetor.
Abaixo um código de exemplo.
Ele conta as letras, exibe o resultado final sem repetição (como vc queria) e ainda em ordem alfabética, de forma consideravelmente mais rápida e eficiente que seu algorítmo:
public class ContarLetras {
public static int[] contarCaracteres(String palavra) {
palavra = palavra.toUpperCase();
int[] letras = new int[27];
for (char letra : palavra.toCharArray()) {
if (Character.isLetter(letra)) { //Só conta se forem letras
int indice = (int)letra - 65; //A é 65. Portanto, índice 0.
letras[indice]++;
}
}
return letras;
}
public static void exibirContagem(int[] contagens) {
int letra = 65;
for (int contagem : contagens) {
if (contagem > 0)
System.out.println("A letra " + ((char)letra) + " parece " + contagem + " vezes.");
letra++;
}
}
public static void main(String[] args) {
exibirContagem(contarCaracteres("Vinicius Godoy de Mendonca"));
}
}