Percursos
/
Java
Java
/
Exercícios
/
Temos de os apanhar todos
Temos de os apanhar todos

Temos de os apanhar todos

Exercício de aprendizagem

Introdução

Sets

Um Set é uma coleção não ordenada que (ao contrário de List) garante não conter valores duplicados.

O parâmetro de tipo genérico da interface Set indica o tipo dos elementos contidos no Set:

Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");

Repara que o método Set.of() cria uma instância de Set não modificável. Tentar chamar métodos como add e remove nesta instância dá origem a uma exceção em tempo de execução.

Para criar um Set modificável, tens de instanciar uma classe que implementa a interface Set. A classe integrada mais utilizada que implementa esta interface é a classe HashSet.

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

A interface Set estende as interfaces Collection e Iterable e, por isso, partilha muitos métodos com outros tipos de coleções. No entanto, uma diferença notável em relação à interface Collection é que métodos como add e remove devolvem um boolean (em vez de void), que indica se o elemento estava contido no conjunto quando esse método foi chamado:

Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1

Instruções

A tua nostalgia pelas cartas Blorkemon™️ não dá sinais de abrandar, chegaste mesmo a voltar a colecioná-las e estás a convencer os teus amigos a juntarem-se a ti.

Neste exercício, vais usar a interface Set para te ajudar a gerir a tua coleção, já que as cartas duplicadas não são importantes quando o teu objetivo é obter todas as cartas existentes.

1. Iniciar uma coleção

Acabaste de encontrar a tua antiga reserva de cartas Blorkemon™️! A reserva contém imensas cartas duplicadas, por isso está na hora de começares uma nova coleção, removendo as duplicadas.

Queres mesmo que os teus amigos se juntem à tua loucura Blorkemon™️, e a melhor forma é dar o pontapé de saída na coleção deles, dando-lhes uma carta.

Implementa o método newCollection, que transforma uma lista de cartas num Set que representa a tua nova coleção.

GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}

2. Aumentar a coleção

Assim que tens uma coleção, ela ganha vida própria e tem de crescer.

Implementa o método addCard, que recebe uma nova carta e o teu conjunto atual de cartas colecionadas. O método deve adicionar a nova carta à coleção se esta ainda não estiver presente e deve devolver um boolean que indica se a coleção foi atualizada.

Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true

collection.contains("Scientuna");
// => true

3. Começar a trocar

Queres mesmo que os teus amigos se juntem à tua loucura Blorkemon™️, por isso está na hora de começar a trocar!

Quando trocas com amigos, nem todas as trocas valem a pena, nem sequer são possíveis. Só deves trocar se tanto tu como o teu amigo tiverem uma carta que o outro não tem.

Implementa o método canTrade, que recebe a tua coleção atual e a coleção de um dos teus amigos. Deve devolver um boolean que indica se é possível fazer uma troca, seguindo as regras acima.

Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true

4. Identificar cartas comuns

Tu e os teus amigos entusiastas de Blorkemon™️ reúnem-se e interrogam-se sobre quais são as cartas mais comuns.

Implementa o método commonCards, que recebe uma lista de coleções e devolve uma coleção das cartas que todas as coleções têm.

GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}

5. Todas as cartas

Será que tu e os teus amigos têm, no conjunto, todas as cartas Blorkemon™️?

Implementa o método allCards, que recebe uma lista de coleções e devolve uma coleção com todas as cartas diferentes de todas as coleções combinadas.

GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}
Editar via GitHub A ligação abre numa nova janela ou separador
Java Exercism

Estás pronto para começar Temos de os apanhar todos?

Inscreve-te no Exercism para aprenderes e dominares Java com 26 conceitos158 exercícios, e mentoria humana real, tudo grátis.