Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

diogodejesus

HashSet e TreeSet

Recommended Posts

E ai galera, estou com dificuldades em Estruturas de Dados, alguém consegue me ajudar nestes 2 exercicios abaixo.

02. Implemente um programa que receba uma string e armazene cada um de seus caracteres dentro de um objeto da classe HashSet e de outro objeto da classe TreeSet. Use iteradores para imprimir os caracteres presentes em cada um dos conjuntos (sets).

 

03. Crie uma classe Pessoa com os seguintes atributos: nome e sobrenome, do tipo string e idade do tipo inteiro. Crie um construtor para esta classe que receba como parâmetro os três valores. Crie também o método toString.

 

Então faça com que esta classe implemente a interface Comparable, o que significa implementar o método int compareTo(Pessoa p). Ao implementar esta interface um objeto da classe Pessoa poderá ser comparado automaticamente com outros objetos da mesma classe. Este método deve comparar o objeto sobre o qual foi chamado com outro passado por parâmetro, retornando um valor negativo se o primeiro vier antes do segundo, 0 se forem iguais e positivo se o primeiro vier depois do segundo. A comparação deve levar em conta o nome, depois o sobrenome e então a idade.

 

Teste esta classe fazendo um programa que crie um Vector de pessoas e adicione as seguintes pessoas:

Pessoa("joão", "silva", 24)

Pessoa("joão", "silva", 16)

Pessoa("joão", "pedro", 31)

Pessoa("andré", "roma", 68)

Pessoa("marco", "costa", 34)

Pessoa("daniel", "souza", 27)

Então ordene o vetor e imprima os seus elementos, que agora deverão estar na ordem especificada por compareTo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, tudo tranquilo Rafael obrigado por ter respondido !Na verdade estou apanhando feio heeheh, mas tenta me ajudar mais no exericio um fiz esta parte mas não sei se está certo até ai, acho até que não. Valeu/*02. Implemente um programa que receba uma string e armazene cada um de seus * caracteres dentro de um objeto da classe HashSet e de outro objeto da classe TreeSet. * Use iteradores para imprimir os caracteres presentes em cada um dos conjuntos (sets).*/import java.util.*;public class exercicio2{ public static void main(String[] args) { String s = Entrada.leiaString("Entre com uma seqüência de caracteres"); int i; HashSet h = new HashSet(); for (i = 0; i < s.length(); i++) { //Object o = new Character(s.charAt(i)); h.add(new Character(s.charAt(i))); //h = add.o; } System.out.println(h); }}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, vamos lá...

 

No seu caso que você já fez, você está inserindo corretamente os elementos no hash. Mas uma estrutura hash você só acessa os elementos diretamente não da pra percorrer o hash todo se você não souber os elementos dele. Pra resolver isso, a estrutura HashSet tem o método iterator()

 

Esse método te retorna um objeto da classe Iterator contendo todos os elementos da estrutura... Com o Iterator você consegue imprimir os elementos que estão na sua estrutura

 

Ex: Iterator i = h.iterator();

while(i.hasNext())

System.out.println(i.next);

 

 

A mesma lógica se aplica ao TreeSet

 

Qualquer dúvida ao em relação as classes e ao funcionamento do hash e de uma árvore é só perguntar....

 

 

No exercicio 3, quando você implementar a interface Comparable.. você tem que implementar o método compareTo. Nesse método você vai definir as regras para dizer se um objeto é maior do que o outro. Se tiver dúvida em como faze-lo estamos ai =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bá brother tu é ninja mesmo, tu é o cara, valeu pelas dicas, mas em compensasão sou meio fraco ainda, heheheSeguinte posso fazer tudo isso dentro do "main" ? public static void main(String[] args) { String s = Entrada.leiaString("Entre com uma seqüência de caracteres"); HashSet h = new HashSet(); Iterator i = h.iterator(); while(i.hasNext()) System.out.println(i.next); }}Aonde usarei a String de entrada ? E deu um errinho no printlnDepois pedirei mais dicar sobre o 3, valeu meu amigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehe que nada, com o tempo você aprendendo esses macetes.Pode ficar tudo no main sim.O erro no println é que eu esqueci de colocar o () -> System.out.println(i.next());A String de entrada você usa da maneira que você colocou no primeiro post.Só que no lugar do System.out.println(h); Você tem que fazer o passo com o Iterator que eu te mostrei. Mas apesar de eu ter mostrado um passo pra solução, o importante é que você entenda como funciona e porque funciona.No problema 3 tenta seguir a dica de na implementação do método compareTo você colocar as regras para dizer que um objeto é diferente do outro e tente fazer. Se agarrar, eu te mostro um exemplo mais detalhadoBoa sorte ae

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu grande amigo, já te chamo de amigo, pois quem ajuda os outrso é sempre um amigo !Dá uma analisada acho que é issoNotei que o que muda é a forma que ele ordena dentro do objeto é isso, ou tem alguma lógica diferente ?import java.util.*;public class exercicio2{ public static void main(String[] args) { String s = Entrada.leiaString("Entre com uma seqüência de caracteres"); HashSet h = new HashSet(); int c; for (c = 0; c < s.length(); c++) { h.add(new Character(s.charAt©)); } Iterator i = h.iterator(); while(i.hasNext()) { System.out.print("["+ i.next() +"]"); } System.out.println(); TreeSet x = new TreeSet(); for (c = 0; c < s.length(); c++) { x.add(new Character(s.charAt©)); } Iterator it = x.iterator(); while(it.hasNext()) { System.out.print("["+ it.next() +"]"); } System.out.println(); }}

Compartilhar este post


Link para o post
Compartilhar em outros sites

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Sim é isso mesmo, uma estrutura de árvore já ordena os elementos na inserção... Por isso, na árvore, os elementos estão sempre ordenados. O custo disso é que o tempo para inserir e remover um elemento varia de acordo com o tamanho da árvore, e pode ser bem demorado.

 

Já no hash você não ordena nada, você apenas guarda dados que você consegue inserir, pesquisa, e remover em um tempo muito rápido (e constante). O custo é que você disperdiçã espaço (memória) pra montar a estrutura.

 

Por isso que na hora de imprimir na tela, a ordem dos elementos não é a mesma.

 

Da uma pesquisada no google e no wikipedia que você acha muito material que explica isso muito bem, e com muitos detalhes

 

flws vei http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bá velho, tu explica muito bem, tu é programador a tempo, eu tenho 30 anos faço Sistemas de Informação, mas to apanhando pois trabalho como designer e faço sites, mas com o tempo aprendo java também, heheheSeguinte me dá uma ajuda como faço a comparação dentro do compareTopublic class Pessoa implements Comparable<Domino>{ private String nome, sobrenome; private int idade; public Pessoa (string nome, string sobrenome, int idade) { this.nome = nome; this.sobrenome = sobrenome; this.idade = idade; } public int compareTo(Pessoa p) //olhar a documentaçao na interface Comparable { if () { return (); } public String toString() { return ("[" + noem + " " + sobrenome + " " + idade "]"); }}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nada, to no 5° período de ciências da computação ainda =P

 

O compareTo funciona da seguinte forma, ele retorna um número negativo se o seu objeto for menor do que o que você recebeu pelo parametro, zero se for igual, e um número positivo se for maior... Qualquer dúvida olhe esse link

 

Se você vai fazer a comparação por idade, verifique... Se a variavel idade do seu objeto for menor do que a idade do outro objeto, retorne 1. Se for igual retorne zero. Se for menor retorne -1.

 

É bom criar os setter e getters do objeto pra ajudar nessa operação

 

public void setIdade(int idade){ this.idade = idade;}

 

public int getIdade(){ return idade;}

 

Assim você pega a idade do outro objeto usando um p.getIdade(); (Considerando que você recebeu Pessoa p como parametro)

 

Com isso você já vai conseguir montar o compareTo. Sempre que tiver dúvida de classes "nativas" do java, consulte a documentação no site da Sun que ajuda d+. Lá tem tudo muito bem explicado de como funciona a classe, os métodos, o que eles recebem e o que eles devem retornar.

 

Qualquer coisa tamo ae http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai Boa Tarde, mais um ajudinha nesse exercicio, só consegui voltar nele hoje .Meu professor havia dado a seguinte dicaO que precisa ser feito em compareTo é comparar a primeira pessoa pela segunda, com o seguinte critério:- se os nomes forem diferentes, ganha o nome que vier antes (use o método compareTo da classe String)- se os nomes forem iguais, a comparação é então feita com os sobrenomes- se os sobrenomes forem diferentes, ganha o sobrenome que vier antes (de novo, use compareTo da classe String)- se os sobrenomes forem iguais, a comparação é feita com as idades, bastando então subtrair as idades .TRANQUEI AI, consegue me ajudar noi código.public class Pessoa implements Comparable<Pessoa>{ private String nome, sobrenome; private int idade; public Pessoa (String nome, String sobrenome, int idade) { this.nome = nome; this.sobrenome = sobrenome; this.idade = idade; } public void setIdade(int idade){ this.idade = idade; } public int getIdade(){ return idade; } public String compareTo(Pessoa p) //olhar a documentaçao na interface Comparable { if (nome != p.nome) { return (nome - p.nome); } else { if (nome == p.nome) return (sobrenome - { } public String toString() { return ("[" + nome + " " + sobrenome + " " + idade "]"); }}O ENUNCIADO ESTÁ ACIMA CASO PRECISE OLHARvaleu desde já muito obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae,

 

Tipo como String é um objeto você não pode fazer a comparação com != e == porque os resultados que você vai obter provavelmente estarão incorretos... Use o método equals da classe String

 

Uma sugestão é fazer o seguinte:

if(!nome.equals(p.getNome()))return nome.compareTo(p.getNome())else if(!sobrenome.equals(p.getSobrenome()))  return sobrenome.compareTo(p.getSobrenome())  else   return (idade - p.getIdade())

você sempre estará verificando as strings de maneira correta, usara o compareTo delas, e usara as idades em ultimo caso.

 

Não testei o código, mas a ideia é esse... Qualquer dúvida nos conceitos ai de cima é só falar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.