[ Resolvido ] - Nº de letras diferentes em uma String

Boa tarde,

Gostaria de saber como posso verificar o numero de letras diferentes em uma String, pois tenho um questão de um trabalho onde preciso verificar um arrayList de filmes e informar o filme com maior numero de letras diferentes em seu nome. Tem algum método da classe String que faz isso?

Grato,
Jeferson Neves

Faça um método que retorne a quantidade de caracteres diferentes no nome dos filmes, como esse:

[code]private static int getQtdeCaracteresDiferentes(String nomeFilme) {
String textoFinal = “”;

nomeFilme = nomeFilme.toLowerCase();

for (char letra : nomeFilme.toCharArray()) {
    if ((!String.valueOf(letra).trim().isEmpty()) && (!textoFinal.contains(String.valueOf(letra)))) {
        textoFinal += letra;
    }
}

return textoFinal.length();

}[/code]
Com isso, basta você percorrer o ArrayList e guardando quando o nome de um filme contiver mais letras diferentes. Tipo assim:

String filmeMaior = ""; for (String filme : filmes) { if (getQtdeCaracteresDiferentes(filme) > getQtdeCaracteresDiferentes(filmeMaior)) { filmeMaior = filme; } } System.out.println(filmeMaior);

Uma outra forma de resolver esse problema é adicionar todos os caracteres da String a um Set<Character>. Como o Set não permite elementos repetidos, o tamanho dele armazenará a quantidade de caracteres diferentes.

[code]Set set = new HashSet();

for (char c: “abcabc”.toCharArray()) {
set.add©;
}

System.out.println("Número de letras diferentes: " + set.size());[/code]

Há um algoritmo que faz esse calculo, que é o Levenshtein distance.

Origado ao dois amigos que deram as dicas, estarei tentando implementar uma destas dicas, vou tentar primeiro o set que parece ser mias curto, se ñ der tento o outro.

Grato,

[quote=raci0nal]Faça um método que retorne a quantidade de caracteres diferentes no nome dos filmes, como esse:

[code]private static int getQtdeCaracteresDiferentes(String nomeFilme) {
String textoFinal = “”;

nomeFilme = nomeFilme.toLowerCase();

for (char letra : nomeFilme.toCharArray()) {
    if ((!String.valueOf(letra).trim().isEmpty()) && (!textoFinal.contains(String.valueOf(letra)))) {
        textoFinal += letra;
    }
}

return textoFinal.length();

}[/code]
Com isso, basta você percorrer o ArrayList e guardando quando o nome de um filme contiver mais letras diferentes. Tipo assim:

String filmeMaior = ""; for (String filme : filmes) { if (getQtdeCaracteresDiferentes(filme) > getQtdeCaracteresDiferentes(filmeMaior)) { filmeMaior = filme; } } System.out.println(filmeMaior);[/quote]

Boa tarde,

Acabei implementando a dica acima do raci0nal (que ta funcionando ok), pois foi a que entendi um pouco melhor e como terei que apresentar para a profª, tenho que saber o que o código faz e saber explicar o funcionamento… Bem só me falta tirar umas dúvidas simples, aí vai:

1 - Pra que passar todo nome do filme pra minúsculo(toLowerCase())? Eu testei sem e retornou a mesma coisa, realmente precisa, se sim pra que?

2 - Este for abaixo, não sei se estou certo, mas entendi que transformo o nome do filme em charArray e depois no if ja não entendi muito bem o que faz…sei que isEmpty() retorna true se o array for vazio…o trim() se não me engano retorna uma cópia da string sem espaços em branco, mas a lógica “do todo” não entendi bem, e se for questionado não saberei explicar.

 for (char letra : nomeFilme.toCharArray()) {  
        if ((!String.valueOf(letra).trim().isEmpty()) && (!textoFinal.contains(String.valueOf(letra)))) {  
            textoFinal += letra;  
        }

Se alguém puder me auxiliar agradeceria, pois estou buscando aprender e não somente pegar as dicas, copiar e se compilar ta bom… :slight_smile:

Grato,

Bom dia,

Queria um auxílio de vocês, conclui meu trabalho e agora gostaria de um auxílio para me darem uma breve explicação de como funciona a lógica do Set,ou melhor do funcionamento deste método abaixo, pois me deram diversas dicas e eu inicialmente tinha feito comuma dica que eu embora não tivesse entendido toda a lógica, me pareceu mais simples pra eu explicar na apresentação do trabalho, mas como usei Set em outro metodo do trabalho(que t foi dica de vocês) agora voltei aqui e implementei esse aqui, que ficou menor, mas ainda não sei bem a lógica de seu funcionamento, e como tenho que apresentar este trabalho provavelmente serei questionado desses métodos, pois não aprendemos ainda, a gente até poderia usar algo que ainda não aprendemos mas temos que explicar o funcionamento, senão corre-se o risco de anulação pois não posso usar nada que eu não saiba o que estou fazendo…

olha como ficou;

[code]
public int maisLetrasDiferentes(String titulo) {

    Set<Character> set = new HashSet<Character>();
    
    String a = null;
    int maior = 0;
    for (Filme f : lista) {
        a = f.getTitulo();
        for (char letra : a.toCharArray()) {
            set.add(letra);
        }
        if (set.size() > maior) {
            maior = set.size();
        }
    }
    return maior;
}[/code]

Como tenho que retornar o objeto Filme(todo), aqui eu não consegui, dai eu comparo este numero retornado em outro metodo que retorna o objeto Filme todo(com nome, diretor, ano…)
Mas a lógiga deste 2º método é bem simples e o mais importante é eu saber a lógica deste 1º que postei o código acima…

Se puderem auxiliar agradeço, dei uma lida na API, mas não consegui entender 100%. Na verdade acho que escrevi demais, pois sei que o Set é uma coleção de coisas que não se repete, por isso me auxiliou nisso(pegar o maior numero de letras diferentes em uma string), mas por exemplo quando instancio um Set não sei o que é o HasSet(), achoq ue se eu entender isso ja ta feito, o resto me viro…

Até +.

Você conseguiria fazer o mesmo problema usando um simples array?
No seu caso é bem mais simples, já que o array pode ser um array de booleanos, uma entrada para cada letra.
Por exemplo, para indicar que você achou a letra ‘A’ nesse array de booleanos, você faria:

arrayBooleanos['A'] = true;

Então você seta uma entrada para true se achar a letra correspondente à sua entrada, e cria um método que retorna a contagem de entradas “true” no seu array de booleanos. Não precisa usar “set” nem nada muito complicado.

Se você já estudou inglês, sabe que a saída esperada deste programa é 26. Experimente!

class ContagemLetrasDistintas {
    public static void main (String[] args) {
        String s = "The quick brown fox jumps over the lazy dog.";
        boolean[] b = new boolean [26]; // inicialmente todos os valores são "false"
        for (int i = 0; i < s.length(); ++i) {
            char ch = Character.toUpperCase (s.charAt (i));
            if ('A' <= ch && ch <= 'Z') {
                b[ch - 'A'] = true;
            }
        }
        int contagemLetrasDistintas = 0;
        for (int i = 0; i < b.length; ++i) {
            if (b[i]) contagemLetrasDistintas++;
        }
        System.out.printf ("Existem %d letras distintas na string [%s]%n", contagemLetrasDistintas, s);
    }
}

[quote=entanglement]Se você já estudou inglês, sabe que a saída esperada deste programa é 26. Experimente!

class ContagemLetrasDistintas { public static void main (String[] args) { String s = "The quick brown fox jumps over the lazy dog."; boolean[] b = new boolean [26]; // inicialmente todos os valores são "false" for (int i = 0; i < s.length(); ++i) { char ch = Character.toUpperCase (s.charAt (i)); if ('A' <= ch && ch <= 'Z') { b[ch - 'A'] = true; } } int contagemLetrasDistintas = 0; for (int i = 0; i < b.length; ++i) { if (b[i]) contagemLetrasDistintas++; } System.out.printf ("Existem %d letras distintas na string [%s]%n", contagemLetrasDistintas, s); } } [/quote]

Obrigado pela dica, alterei aqui pra o meu trabalho e funcionou e retornou o mesmo resultado do metodo que enviei acima… Só que aprendemos apenas arrayList, e nada de array, tentei passar para arrayList, mas não deu, acho que não pode criar arraylist… mas só uma pequena dúvida, ja que estava até agora trabalhando na aula com arraylist e nada de arrays, o que faz esta linha… não entendi direito a sintaxe.

b[ch - 'A'] = true;  // acho que seria o mesmo que b.add('A'); em arrayList, mas não entendi  o "ch - '' 

Só isso e depois eu edito como resolvido o assunto e vou ir tentando estudar sozinho o hashMap…

Até+