Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Por que eu não posso usar um Set<Integer>

Por que eu não posso usar um Set no lugar do Collection?

Set<String> chaves = nomesParaIdade.keySet();
    for(String nome:chaves) {
        System.out.println(nome);
    }



    /*usar um Set aqui **/ Collection<Integer> valores = nomesParaIdade.values();
    for(Integer idade : valores) {
        System.out.println(idade);
    }
2 respostas
solução!

Opa! Boa tarde, Lucas. Tudo certo?

Então, a resposta simples é que o método .keySet() possui um retorno do tipo Set, e que o values() possui um retorno do tipo Collection, mas obviamente essa resposa não é satisfatória: afinal de contas, qual o motivo pros retornos serem diferentes?

Para entendermos a razão por trás disso, primeiro precisamos entender duas coisas:

  1. Um Collection é um "tipo de lista", por assim dizer. Isto é, são apenas valores desordenados sem nenhuma regra especial em cima deles;
  2. Um Set é uma Collection, afinal de contas ele também é uma lista. Entretanto, ele possui uma regra especial: é impossível existirem valores duplicados dentro de um Set.

Ou seja, o código abaixo é uma verdade:

Set<Integer> numeros = new HashSet<>();

numeros.add(1); // adicionado o "1" dentro da lista.
numeros.add(1); // ignorado, afinal o "1" já existe na lista.
numeros.add(2); // adicionado o "2" dentro da lista.
numeros.add(3); // adicionado o "3" dentro da lista.
numeros.add(2); // ignorado, afinal o "2" já existe na lista.

System.out.println(numeros); // [1, 2, 3]

Com isso em mente, agora precisamos entender o que é um Map: um Map nada mais é do que uma lista de chave-valor. Ou seja, para cada valor dentro dessa lista, agora também existe uma "chave", um identificador único daquele valor.

Resumo da ópera: no exercício proposto pelo professor, nós temos os nomes de pessoas sendo salvos como "chaves", e idades sendo salvos como "valores". Lembra que um Set não podem ter duplicatas? O mesmo se aplica às chaves aqui, que por sua vez, são Set's. Eu posso ter apenas um Paulo dentro do Map, com idade 31, por exemplo. Mas nada me impede de ter mais um Adriano, com idade 31 também.

O método .keySet() possui um retorno do tipo Set, pois não existem chaves duplicadas em um Map, mas o mesmo não se aplica aos valores. Por isso, o values() possui um retorno do tipo Collection.

Muito obrigado Luciano.