Contar o numero de vezes que a string se repete na List

Ola! :lol:
Estou com uma dificuldade, tenho um arrayList com: os seguintes dados
//

ArrayList<String> Lista = new ArrayList<String>(8); Lista.add("Adao-Bastos"); Lista.add("Ana-Costa"); Lista.add("Filipe-Celso"); Lista.add("Ana-Costa"); Lista.add("Ana-Costa"); Lista.add("Filipe-Celso"); Lista.add("Doroteia-Paulo"); Lista.add("Filipe-Celso"); Lista.add("Adao-Bastos"); Collections.sort(Lista); // ordena a lista em ordem alfabética.
quero contar o numero de vezes que cada nome se repete na lista e retornar cada nome
com um valor inteiro representando o numero de vezes que o nome ocorre na Lista.
[color=darkblue] [/color]
//se puderem façam não considerando os dados que existem na Lista, i.e, considerem para qualquer contar qualquer lista com Strings
:roll:

Precisas percorrer a lista e comparar os elementos entre si.
Existem algoritmos ótimos pra isso (ótimo do ponto de vista computacional, não ótimos de “legais”).
É exercício de apostila ou faculdade, isso?

Use um int para contar e o for para acessar os indexs da List. Ai você pode usar o “public boolean contains(CharSequence s)” para verificar se a String do index tem um certo nome. Caso não saiba, esse method contains verifica por maiusculas e minusculas (case sensitive).

é exercicio de pratica do 1º ano - Faculdade.
LeoRamos posso percorrer a lista e compara-los

  • quero considerar que funcione para qualquer lista.
    Bills - desdobra um pouco mais a tua ideia, axo que o que
    estas a dizer, é o que preciso.

Uma maneira simples de fazer, mas não sei se é ótima (achei engraçado a observação lá em cima :slight_smile: )

Crie um Map<String, Integer> e reserve. Ele vai conter a contagem de ocorrências para cada elemento.

Percorra a lista e para cada item:
Se ele já estiver no map, pegue o total e acrescente 1.
Se não estiver, inclua como 1

No final do loop o Map vai conter:
“Adao-Bastos” => 2
“Ana-Costa” => 3
“Filipe-Celso” => 3
“Doroteia-Paulo” => 1

Obrigado !
[color=darkblue]gomesrod[/color]
vou tentar a tua dica.

O código que eu queria te dizer era esse. Agora cabe a você fazer uma função com isso =P

[code]import java.util.ArrayList;

public class Demo {

public static void main(String[] args) {
	// sua lista
	ArrayList<String> Lista = new ArrayList<String>();
	Lista.add("Adao-Bastos");
	Lista.add("Ana-Costa");
	Lista.add("Filipe-Celso");
	Lista.add("Ana-Costa");
	Lista.add("Ana-Costa");
	Lista.add("Filipe-Celso");
	Lista.add("Doroteia-Paulo");
	Lista.add("Filipe-Celso");
	Lista.add("Adao-Bastos");
	//Collections.sort(Lista); // ordena a lista em ordem alfabética.

	// verifica quantas "Ana" tem na list...
	String toTest = "Ana";
	int count = 0;
	for(int i=0; i < Lista.size(); i++) {
		String s = Lista.get(i);
		if(s.contains(toTest)) count++;
	}
	System.out.println("A lista contém " + count + " pessoas com o nome \"" + toTest +"\"");
}

}[/code]

Dica do gomesrod:

[code]List<String> lista = new ArrayList<String>(8);
lista.add(“Adao-Bastos”);
lista.add(“Ana-Costa”);
lista.add(“Filipe-Celso”);
lista.add(“Ana-Costa”);
lista.add(“Ana-Costa”);
lista.add(“Filipe-Celso”);
lista.add(“Doroteia-Paulo”);
lista.add(“Filipe-Celso”);
lista.add(“Adao-Bastos”);
Collections.sort(lista); // ordena a lista em ordem alfabética.

Map<String, Integer> cont = new TreeMap<String, Integer>();
for (String nome : lista) {
if (!cont.containsKey(nome))
cont.put(nome, 0);
cont.put(nome, cont.get(nome) + 1);
}

for (Map.Entry<String, Integer> entry : cont.entrySet()) {
System.out.prinlnt("%s => %d%n", entry.getKey(), entry.getValue());
}[/code]

Todo código do Bills pode ser implementado com uma chamada ao método Collections.frequency:

String toTest = &quot;Ana&quot;; int count = Collections.frequency(lista, toTest); System.out.println(&quot;A lista contém &quot; + count + &quot; pessoas com o nome \&quot;&quot; + toTest +&quot;\&quot;&quot;);

Provavelmente mais eficiente para coleções no geral por usar iterator no lugar do get, como ele fez.

Obrigado a todos, pelo pronto Socorro.
ja funciona, pelo codigo…

Collections.sort(Lista); for (int i =0; i <= Lista.size(); i++) { int count = Collections.frequency(Lista, lista.get(i)); System.out.println(lista.get(i)+" recebeu "+ count+"votos "); }
mais repete os nomes pela quantidade de vezes que existe no ficheiro.
qualquer coisa como isto:

run:

Adao-Barbosa recebeu 4 Adao-Barbosa recebeu 4 Adao-Barbosa recebeu 4 Adao-Barbosa recebeu 4 Filipe-Celso recebeu 2 Filipe-Celso recebeu 2 Sandra-Pimenta recebeu 6 Sandra-Pimenta recebeu 6 Sandra-Pimenta recebeu 6 Sandra-Pimenta recebeu 6 Sandra-Pimenta recebeu 6 Sandra-Pimenta recebeu 6
BUILD SUCCESSFUL (total time: 0 seconds)

Você testou o código com o map que postei ali?

Ah, outra coisa… esse tópico não tem nada de off-topic. Isso é dúvida de Java Básico.
Procure ler com atenção a descrição dos fóruns antes de postar, vou mover o tópico.

Veja o código completo:

[code]package snippet;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class Snippet {
public static void main(String[] args) {
List<String> lista = new ArrayList<String>();
lista.add(“Adao-Bastos”);
lista.add(“Ana-Costa”);
lista.add(“Filipe-Celso”);
lista.add(“Ana-Costa”);
lista.add(“Ana-Costa”);
lista.add(“Filipe-Celso”);
lista.add(“Doroteia-Paulo”);
lista.add(“Filipe-Celso”);
lista.add(“Adao-Bastos”);

	Map&lt;String, Integer&gt; cont = new TreeMap&lt;String, Integer&gt;();
	for (String nome : lista) {
		if (!cont.containsKey(nome))
			cont.put(nome, 0);
		cont.put(nome, cont.get(nome) + 1);
	}

	for (Map.Entry&lt;String, Integer&gt; entry : cont.entrySet()) {
		System.out.printf(&quot;%s =&gt; %d%n&quot;, entry.getKey(), entry.getValue());
	}
}

}
[/code]

E a saída que ele gerou:
Adao-Bastos => 2
Ana-Costa => 3
Doroteia-Paulo => 1
Filipe-Celso => 3

1 curtida

[quote=ViniGodoy]Veja o código completo:

[code]package snippet;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class Snippet {
public static void main(String[] args) {
List<String> lista = new ArrayList<String>();
lista.add(“Adao-Bastos”);
lista.add(“Ana-Costa”);
lista.add(“Filipe-Celso”);
lista.add(“Ana-Costa”);
lista.add(“Ana-Costa”);
lista.add(“Filipe-Celso”);
lista.add(“Doroteia-Paulo”);
lista.add(“Filipe-Celso”);
lista.add(“Adao-Bastos”);

	Map&lt;String, Integer&gt; cont = new TreeMap&lt;String, Integer&gt;();
	for (String nome : lista) {
		if (!cont.containsKey(nome))
			cont.put(nome, 0);
		cont.put(nome, cont.get(nome) + 1);
	}

	for (Map.Entry&lt;String, Integer&gt; entry : cont.entrySet()) {
		System.out.printf(&quot;%s =&gt; %d%n&quot;, entry.getKey(), entry.getValue());
	}
}

}
[/code]

E a saída que ele gerou:
Adao-Bastos => 2
Ana-Costa => 3
Doroteia-Paulo => 1
Filipe-Celso => 3[/quote]

desculpe ressuscitar o tópico, é que estou precisando de ajuda urgentemente, estou tentando aplicar o mesmo que vc fez aqui, tenho uma lista com nomes de cursos, e preciso saber quantas vezes cada nome de curso se repete na lista, mas não estou conseguindo, pois só está exibindo o último elemento da lista e sua respectiva quantidade, o que devo fazer para que exiba todos os elementos e suas respectivas quantidades?

a lista no momento está com os seguintes elementos retornados de uma consulta no banco de dados:

Operador de Microcomputador (IPD, Windows 7 e Word)
Operador de Microcomputador (IPD, Windows 7 e Word)
Projetista de Maquete Eletrônica no SketchUp
Excel Avançado
Operador de Áudio.

Só está aparecendo o ultimo ítem “Operador de audio - 1”

Segue meu código:

CursoDAO cDB = new CursoDAO();
                            ArrayList&lt;Curso&gt; lista;
                            cDB.conectar();
                            lista = cDB.contabilizarInscritos();
                            int total = 0;
                            Map&lt;String, Integer&gt; map = new TreeMap&lt;String, Integer&gt;();
                            for (Curso c:lista){
                                if (!map.containsKey(c.getNome())){
                                    map.put(c.getNome(), 0);
                                    map.put (c.getNome(), map.get(c.getNome()) + 1);
                                }
                            }
                            &lt;table&gt;
                            for (Map.Entry&lt;String, Integer&gt; entry : map.entrySet()){
                                    &lt;tr&gt;
                                        &lt;td&gt;     
                                            Nome do curso: &lt;%out.print (String.format ("%s", entry.getKey())); %&gt;
                                        &lt;/td&gt;
                                        &lt;td&gt;
                                            Total de inscritos: &lt;%out.print (String.format ("%d%n", entry.getValue())); %&gt;
                                        &lt;/td&gt;
                                    &lt;/tr&gt;
                            }
                            &lt;/table&gt;

Se puder me ajudar a descobrir onde estou errando, agradeço.

Posta o conteúdo do método:
cDB.contabilizarInscritos()

Quer apostar quanto que tem um new lá fora de um while, e deveria estar dentro?

Já achei o erro:

Troque isso:

if (!map.containsKey(c.getNome())){ map.put(c.getNome(), 0); map.put (c.getNome(), map.get(c.getNome()) + 1); }

Por isso:

if (!map.containsKey(c.getNome())){ map.put(c.getNome(), 0); } map.put (c.getNome(), map.get(c.getNome()) + 1);

[quote=ViniGodoy]Já achei o erro:

Troque isso:

if (!map.containsKey(c.getNome())){ map.put(c.getNome(), 0); map.put (c.getNome(), map.get(c.getNome()) + 1); }

Por isso:

if (!map.containsKey(c.getNome())){ map.put(c.getNome(), 0); } map.put (c.getNome(), map.get(c.getNome()) + 1); [/quote]

troquei mas ai ele fez foi somar todas as ocorrências que são 5 e apresentar só no Operador de audio que só está aparecendo na lista 1 vez: “Operador de audio = 5”

[quote=ViniGodoy]Posta o conteúdo do método:
cDB.contabilizarInscritos()

Quer apostar quanto que tem um new lá fora de um while, e deveria estar dentro?[/quote]

coloquei o new dentro do While e agora funcionou corretamente, muito obrigado pela ajuda cara, vc não imagina o quanto me ajudou, se eu fosse descobrir isso sozinho jamais descobriria esse erro