RESOLVIDO | Contar quantas vezes se repete cada letra e mostrar ao final sem repetir

Meu código atual é este abaixo, ignorem o começo de interface. Quero ajustar somente a saida do ultimo método no console.

package trabalho_18_02_11;

import java.awt.Button;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

public class Exercicio extends JFrame {
	JPanel painel = new JPanel();
	JLabel palavra = new JLabel("Palavra: ");
	Button botaoOk = new Button("ok");
	JLabel resultado = new JLabel("Resultado: ");
	Button botaoLimpar = new Button("Limpar");

	JTextField tfPalavra = new JTextField(30);
	JTextArea taResultado = new JTextArea(5, 15);

	JScrollPane scroll = new JScrollPane(taResultado,
			ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
			ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

	public Exercicio() {
		super("Programinha ");

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		taResultado.setLineWrap(true);
		taResultado.setWrapStyleWord(true);
		painel.add(palavra);
		painel.add(tfPalavra);
		painel.add(botaoOk);
		painel.add(resultado);
		painel.add(scroll);
		setContentPane(painel);
		painel.add(botaoLimpar);
		setSize(500, 300);
		setVisible(true);

	}

	public void actionPerformed(ActionEvent evt) {
		if (evt.getSource() == botaoOk) {

		}
	}

	public static void main(String args[]) throws IOException {
		// Exercicio fu = new Exercicio();

		new Exercicio().setVisible(true);

// Programinha Todo começa aqui

		char carac[] = new char[35];
		int contagem[] = new int[35];
		int cont = 0;
		char c = 0;
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("Palavra: ");
		String str = bf.readLine();
		str = str.toUpperCase();
		int len = str.length();
		for (int i = 0; i < len; i++) {
			c = str.charAt(i);
			// System.out.println(c);

			for (int x = 0; x < len; x++) {
				if (str.charAt(x) == c) {
					cont++;
				}
			}
			carac[i] = c;
			contagem[i] = cont;
			cont = 0;
		}

		for (int i = 0; i < carac.length; i++) {

			if (carac[i] != 0) {
				System.out.println(" " + carac[i] + " - " + contagem[i] + "  ");
			}
		}

	}

}

A minha duvida é a seguinte:

Quando coloco a palavra “TESTE” a saída é:

T - 2
E - 2
S - 1
T - 2
E - 2

E gostaria que a saída fosse sem repertir as letras ja contadas.

T - 2
E - 2
S - 1

Voce pode usar algum tipo List ou só vetor []?

Nesse link tem a solução

Abraço,

[quote=fre_d]Nesse link tem a solução

Abraço,[/quote]

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.

Tenho a mesma dúvida.

Tchauzin!

Posso usar tanto list como vetor, mas não consigo ver como podem me ajudar.

vc ja tentou conferir as saidas …???

por exe…

se T diferente de algumas das letras q ja saiu …

imrpima…

ou pegue as letas e compara uma com as outras se for igual vc aumenta o cont e depois imprime

tem um monte de geito diferente pra fazer isso …

mais pelo q me parese e o seguinte
vc vai colocar cada letra em uma posiçao do vetor …

[T]
[E]
[S]
[T]
[E]

depois vc faz um FOR de acordo com o length() do vetor …

conferindo a primeira letra com todas as outras … e a segunda com todas as outras e assim por diante … e tipo um FOR dentro de outro FOR

se ela for repitida vc nao imprime …

Tava tentando com buble sort no metodo de saida, mas não consegui.

O método de saída com um buble sort que to tentando é este abaixo:

for (int i = 0; i < carac.length; i++) {
			if (carac[i] != 0) {
				for(int j=carac.length; j>0; j--){
					if(carac[i]==carac[j]){ // ta dando um erro nesta linha, somente ao executar.
						System.out.println(" " + carac[i] + " - " + contagem[i] + "  ");
					}
				}
			}
		}

opa blz?
Tenta isso aki
Não é o melhor dos códigos …

	public static void main(String[] args) {
		// Palavra a ser contada
		String palavra = "TEStE";
		
		// Se quiser diferenciar maiusculas de minusculas deixe true.
		boolean isCaseSensitive = false;
		
		List<String> letras = new ArrayList<String>(); 
		Integer contador[] = new Integer[palavra.length()]; 
		
		int posicaoContador = 0;
		// Realiza a contagem
		for (int i = 0; i < palavra.length(); i++) {
			String carac = ""+palavra.charAt(i);
			if(!isCaseSensitive) carac = carac.toUpperCase();

			if(letras.contains(carac)){
				contador[letras.indexOf(carac)]++;
			} else {
				letras.add(carac);
				contador[posicaoContador] = 1;
				posicaoContador++;
			}
		}
		
		// Vai exibir a contagem
		for (int i = 0; i < letras.size(); i++) {
			System.out.println(letras.get(i) + " - " + contador[i]);
		}
	}

É 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.

Eu consegui o codigo certo com a ajuda do Michel, porém so falta linkar corretamente com a interface.

Segue abaixo o código inteiro:

package aula02;

import java.awt.Button;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

public class FormUser extends JFrame {
	JPanel painel = new JPanel();
	JLabel palavra = new JLabel("Palavra: ");
	Button botaoOk = new Button("ok");
	JLabel resultado = new JLabel("Resultado: ");
	Button botaoLimpar = new Button("Limpar");

	JTextField tfPalavra = new JTextField(30);
	JTextArea taResultado = new JTextArea(5, 15);

	JScrollPane scroll = new JScrollPane(taResultado,
			ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
			ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

	public FormUser() {
		super("Programinha ");

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		taResultado.setLineWrap(true);
		taResultado.setWrapStyleWord(true);
		painel.add(palavra);
		painel.add(tfPalavra);
		painel.add(botaoOk);
		painel.add(resultado);
		painel.add(scroll);
		setContentPane(painel);
		painel.add(botaoLimpar);
		setSize(500, 300);
		setVisible(true);

	}

	public void actionPerformed(ActionEvent evt) {
		if (evt.getSource() == botaoOk) {
			taResultado.setText(contaPalavra(tfPalavra.getText()));
		}
	}

	public static void main(String args[]) throws IOException {
		new FormUser().setVisible(true);
	}
	public static String contaPalavra(String palavra){
		String result="";
		List<String> letras = new ArrayList<String>(); 
		Integer contador[] = new Integer[palavra.length()]; 
		
		int posicaoContador = 0;
		// Realiza a contagem
		for (int i = 0; i < palavra.length(); i++) {
			String carac = ""+palavra.charAt(i);
			carac = carac.toUpperCase();

			if(letras.contains(carac)){
				contador[letras.indexOf(carac)]++;
			} else {
				letras.add(carac);
				contador[posicaoContador] = 1;
				posicaoContador++;
			}
		}
		// Vai exibir a contagem
		for (int i = 0; i < letras.size(); i++) {
			result += (letras.get(i) + " - " + contador[i]+"\n");
		}
		System.out.println(result);
		return result;
	}
}

Uma maneira fácil de se fazer, seria vc comparar com o alfabeto…
Algo como:

for(...){
   if(carac[i] = letra[j]){ //compara o caracter do for com a letra do alfabeto
        //tua logica
   }
} 

A parte do código ja esta muito bem resolvida, só peço um help para ajudar a linkar o codigo com a interface.

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"));
    }
}