O grupo no qual você está postando é um grupo da Usenet. As mensagens postadas neste grupo farão com que o seu e-mail fique visível para qualquer pessoa na internet.
Eu sei que Maurício vai querer me esganar por isso e falar que eu só jogava Tetris nas aulas dele, mas...
Quando eu tento remover um determinado objeto de um HashSet, estou recebendo um ConcurrentModificationException. Isso acontece tanto para o método removerUsuario quanto para o método removerProduto.
Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso o Iterator ainda estivesse rodando... =( Me ajudem, por favor! :B
Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas por hora só armazeno objetos do tipo Livro, que são Produto. lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; Na classe principal existe uma declaração private Livro liv e private Usuario usr;
Eh, não pode remover um elemento de um Set que está iterando. Um modo de fazer seria armazenar em outro Set quais deverão ser removidos, e itera nesse set de elementos a remover removendo no set *lprodutos*.
2008/4/3 Arthur Gouveia <arthur.gouv...@gmail.com>:
> Eu sei que Maurício vai querer me esganar por isso e falar que eu só > jogava Tetris nas aulas dele, mas...
> Quando eu tento remover um determinado objeto de um HashSet, estou > recebendo um ConcurrentModificationException. > Isso acontece tanto para o método removerUsuario quanto para o método > removerProduto.
> Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso > o Iterator ainda estivesse rodando... =( > Me ajudem, por favor! :B
> Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas > por hora só armazeno objetos do tipo Livro, que são Produto. > lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; > Na classe principal existe uma declaração private Livro liv e > private Usuario usr;
> Eh, não pode remover um elemento de um Set que está iterando. Um modo de > fazer seria armazenar em outro Set quais deverão ser removidos, e itera > nesse set de elementos a remover removendo no set lprodutos.
> 2008/4/3 Arthur Gouveia <arthur.gouv...@gmail.com>:
> > Eu sei que Maurício vai querer me esganar por isso e falar que eu só > jogava Tetris nas aulas dele, mas...
> > Quando eu tento remover um determinado objeto de um HashSet, estou > recebendo um ConcurrentModificationException. > > Isso acontece tanto para o método removerUsuario quanto para o método > removerProduto.
> > Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso > o Iterator ainda estivesse rodando... =( > > Me ajudem, por favor! :B
> > Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas > por hora só armazeno objetos do tipo Livro, que são Produto. > > lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; > > Na classe principal existe uma declaração private Livro liv e > private Usuario usr;
> 2008/4/3 Vinicius Ferraz <vinicius.fer...@gmail.com>: > > Eh, não pode remover um elemento de um Set que está iterando. Um modo de > > fazer seria armazenar em outro Set quais deverão ser removidos, e itera > > nesse set de elementos a remover removendo no set lprodutos.
> > 2008/4/3 Arthur Gouveia <arthur.gouv...@gmail.com>:
> > > Eu sei que Maurício vai querer me esganar por isso e falar que eu só > > jogava Tetris nas aulas dele, mas...
> > > Quando eu tento remover um determinado objeto de um HashSet, estou > > recebendo um ConcurrentModificationException. > > > Isso acontece tanto para o método removerUsuario quanto para o método > > removerProduto.
> > > Lembro-me vagamente de algo sobre não poder fazer alterações na lista > caso > > o Iterator ainda estivesse rodando... =( > > > Me ajudem, por favor! :B
> > > Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, > mas > > por hora só armazeno objetos do tipo Livro, que são Produto. > > > lUsuarios (HashSet) guarda uma lista de objetos do tipo > Usuario; > > > Na classe principal existe uma declaração private Livro liv e > > private Usuario usr;
> Eu sei que Maurício vai querer me esganar por isso e falar que eu só jogava > Tetris nas aulas dele, mas...
> Quando eu tento remover um determinado objeto de um HashSet, estou recebendo > um ConcurrentModificationException. > Isso acontece tanto para o método removerUsuario quanto para o método > removerProduto.
> Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso o > Iterator ainda estivesse rodando... =( > Me ajudem, por favor! :B
> Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas > por hora só armazeno objetos do tipo Livro, que são Produto. > lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; > Na classe principal existe uma declaração private Livro liv e > private Usuario usr;
> Eu sei que Maurício vai querer me esganar por isso e falar que eu só > jogava Tetris nas aulas dele, mas...
> Quando eu tento remover um determinado objeto de um HashSet, estou > recebendo um ConcurrentModificationException. > Isso acontece tanto para o método removerUsuario quanto para o método > removerProduto.
> Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso > o Iterator ainda estivesse rodando... =( > Me ajudem, por favor! :B
> Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas > por hora só armazeno objetos do tipo Livro, que são Produto. > lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; > Na classe principal existe uma declaração private Livro liv e > private Usuario usr;
Olhando seu código com mais calma: - Por que seus métodos retornam String? Isso está muito feio. - Seus métodos de busca estão muito ineficientes. Se o item procurado for o primeiro numa lista de 10000000 de elementos, o laço vai executar 10000000 vezes ao invés de apenas UMA. Por que você não cai fora do laço quando entra o objeto procurado?
> Ao menos você só colocou um return em cada método, quer dizer que não > foi perdito de tudo, o carão vai diminuir.
> 2008/4/3 Arthur Gouveia <arthur.gouv...@gmail.com>: > > Eu sei que Maurício vai querer me esganar por isso e falar que eu só jogava > > Tetris nas aulas dele, mas...
> > Quando eu tento remover um determinado objeto de um HashSet, estou recebendo > > um ConcurrentModificationException. > > Isso acontece tanto para o método removerUsuario quanto para o método > > removerProduto.
> > Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso o > > Iterator ainda estivesse rodando... =( > > Me ajudem, por favor! :B
> > Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas > > por hora só armazeno objetos do tipo Livro, que são Produto. > > lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; > > Na classe principal existe uma declaração private Livro liv e > > private Usuario usr;
Olha Arthur, você não pode remover um elemento de uma coleção quando ela tá sendo iterada. Esse erro já acontaceu comigo em um foreach que era equivalente ao seu while. Eu vou colocar como eu faria esse método e você ver se vale a pena fazer do meu jeito:
public void removerProduto(int codigo) throws AlgumaExcessao{
if(pesquisarProduto(codigo) == false) throw new AlgumaExcessao();
Eu não sei onde você declara essa variável liv, mas pelo que eu tô vendo ela é visível ao escopo do método removerProduto. Analogamente, eu faria a mesma coisa em removerUsuario.
Atenciosamente, Joshua.
Arthur Gouveia <arthur.gouv...@gmail.com> escreveu: Eu sei que Maurício vai querer me esganar por isso e falar que eu só jogava Tetris nas aulas dele, mas...
Quando eu tento remover um determinado objeto de um HashSet, estou recebendo um ConcurrentModificationException. Isso acontece tanto para o método removerUsuario quanto para o método removerProduto.
Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso o Iterator ainda estivesse rodando... =( Me ajudem, por favor! :B
Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas por hora só armazeno objetos do tipo Livro, que são Produto. lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; Na classe principal existe uma declaração private Livro liv e private Usuario usr;
> Olha Arthur, você não pode remover um elemento de uma coleção > quando ela tá sendo iterada. Esse erro já acontaceu comigo em um foreach que > era equivalente ao seu while. Eu vou colocar como eu faria esse método e > você ver se vale a pena fazer do meu jeito:
> public void removerProduto(int codigo) throws AlgumaExcessao{
> if(pesquisarProduto(codigo) == false) > throw new AlgumaExcessao();
> Eu não sei onde você declara essa variável liv, mas pelo que eu tô > vendo ela é visível ao escopo do método removerProduto. Analogamente, eu > faria a mesma coisa em removerUsuario.
> Eu sei que Maurício vai querer me esganar por isso e falar que eu só > jogava Tetris nas aulas dele, mas...
> Quando eu tento remover um determinado objeto de um HashSet, estou > recebendo um ConcurrentModificationException. > Isso acontece tanto para o método removerUsuario quanto para o método > removerProduto.
> Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso > o Iterator ainda estivesse rodando... =( > Me ajudem, por favor! :B
> Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas > por hora só armazeno objetos do tipo Livro, que são Produto. > lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; > Na classe principal existe uma declaração private Livro liv e > private Usuario usr;
> > Olha Arthur, você não pode remover um elemento de uma coleção > quando ela tá sendo iterada. Esse erro já acontaceu comigo em um foreach que > era equivalente ao seu while. Eu vou colocar como eu faria esse método e > você ver se vale a pena fazer do meu jeito:
> > public void removerProduto(int codigo) throws AlgumaExcessao{
> > if(pesquisarProduto(codigo) == false) > > throw new AlgumaExcessao();
> Cuidado só com o desempenho. Digamos que o produto foi encontrado e > removido. Quantas vezes, em média, a lista é percorrida?
> * pesquisarProduto: 1/2 da lista é percorrida. > * while: 1/2 da lista é percorrida. > * Iprodutos.remove(liv): 1/2 da lista é percorrida.
> Outra coisa: é 'exceção'.
> > }
> > Eu não sei onde você declara essa variável liv, mas pelo que eu tô > vendo ela é visível ao escopo do método removerProduto. Analogamente, eu > faria a mesma coisa em removerUsuario.
> > Atenciosamente, Joshua.
> > Arthur Gouveia <arthur.gouv...@gmail.com> escreveu:
> > Eu sei que Maurício vai querer me esganar por isso e falar que eu só > jogava Tetris nas aulas dele, mas...
> > Quando eu tento remover um determinado objeto de um HashSet, estou > recebendo um ConcurrentModificationException. > > Isso acontece tanto para o método removerUsuario quanto para o método > removerProduto.
> > Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso > o Iterator ainda estivesse rodando... =( > > Me ajudem, por favor! :B
> > Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas > por hora só armazeno objetos do tipo Livro, que são Produto. > > lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; > > Na classe principal existe uma declaração private Livro liv e > private Usuario usr;
Você tem um HashSet em mãos, a melhor maneira que conheço é implementar o equals e o hashCode corretamente e chamar diretamente o remove do conjunto. Sua implementação ficará limpa e eficiente.
E sobre a questão de só ter um retorno por método acho que essa questão é subjetiva e vai variar muito pra cada caso. Acho muito mais simples fazer algo do tipo:
2008/4/3 Joshua Maia Rodrigues <joshuam...@yahoo.com.br>: Olha Arthur, você não pode remover um elemento de uma coleção quando ela tá sendo iterada. Esse erro já acontaceu comigo em um foreach que era equivalente ao seu while. Eu vou colocar como eu faria esse método e você ver se vale a pena fazer do meu jeito:
public void removerProduto(int codigo) throws AlgumaExcessao{
if(pesquisarProduto(codigo) == false) throw new AlgumaExcessao();
Iterator<Produto> i = lprodutos.iterator();
while(i.hasNext()){
liv = (Livro) i.next();
if(liv.getCodigo() == codigo){
break; } } lprodutos.remove(liv); Cuidado só com o desempenho. Digamos que o produto foi encontrado e removido. Quantas vezes, em média, a lista é percorrida?
* pesquisarProduto: 1/2 da lista é percorrida. * while: 1/2 da lista é percorrida. * Iprodutos.remove(liv): 1/2 da lista é percorrida.
Outra coisa: é 'exceção'.
}
Eu não sei onde você declara essa variável liv, mas pelo que eu tô vendo ela é visível ao escopo do método removerProduto. Analogamente, eu faria a mesma coisa em removerUsuario.
Atenciosamente, Joshua.
Arthur Gouveia <arthur.gouv...@gmail.com> escreveu: Eu sei que Maurício vai querer me esganar por isso e falar que eu só jogava Tetris nas aulas dele, mas...
Quando eu tento remover um determinado objeto de um HashSet, estou recebendo um ConcurrentModificationException. Isso acontece tanto para o método removerUsuario quanto para o método removerProduto.
Lembro-me vagamente de algo sobre não poder fazer alterações na lista caso o Iterator ainda estivesse rodando... =( Me ajudem, por favor! :B
Obs.: lProdutos (HashSet) guarda uma lista de objetos do tipo Produto, mas por hora só armazeno objetos do tipo Livro, que são Produto. lUsuarios (HashSet) guarda uma lista de objetos do tipo Usuario; Na classe principal existe uma declaração private Livro liv e private Usuario usr;
Acho que não. Você está assumindo que o hashCode identificaria unicamente o objeto mas isto não acontece, existem colisões. Dependendo do seu algoritmo de hashCode o número de colisões será alto.
Mas também não acredito que metade da lista seja percorrida, creio que seja menor.
2008/4/3 Rodrigo C. L. <tapetedepada...@gmail.com>:
2008/4/3 Rodrigo C. L. <tapetedepada...@gmail.com>:
> > * Iprodutos.remove(liv): 1/2 da lista é percorrida.
> er... remove num hashset é O(1), não?
Isso mesmo. Desculpem-me. O(1) usando uma hash table teórica. E algo próximo a isso, dependendo da razão número de buckets/número de elementos na tabela na prática.
> || > || Rodrigo Cerqueira Lopes > || Estudante de computação na UFCG > || Também em rodrig...@lcc.ufcg.edu.br > || > || "Sofisticado - 1. Falsificado, contrafeito, adulterado. (...)" > || Aurélio Ed. Eletrônica v3.0
Bom, seguindo o que foi dito aqui, alterei meu código...
Os métodos de "Pesquisar" não são pra retornar os dados do usuário ou produto, mas sim para saber se são válidos: apenas retornar um true ou false para exibir uma mensagem de acordo com isso. É um projeto de uma cadeira da Universidade, e é desse modo que foi passado...
> 2008/4/3 Rodrigo C. L. <tapetedepada...@gmail.com>:
> > > * Iprodutos.remove(liv): 1/2 da lista é percorrida.
> > er... remove num hashset é O(1), não?
> Isso mesmo. Desculpem-me. O(1) usando uma hash table teórica. E algo > próximo a isso, dependendo da razão número de buckets/número de elementos na > tabela na prática.
> Bom, seguindo o que foi dito aqui, alterei meu código...
> Os métodos de "Pesquisar" não são pra retornar os dados do usuário ou > produto, mas sim para saber se são válidos: apenas retornar um true ou false > para exibir uma mensagem de acordo com isso. É um projeto de uma cadeira da > Universidade, e é desse modo que foi passado...
> > 2008/4/3 Rodrigo C. L. <tapetedepada...@gmail.com>:
> > > > * Iprodutos.remove(liv): 1/2 da lista é percorrida.
> > > er... remove num hashset é O(1), não?
> > Isso mesmo. Desculpem-me. O(1) usando uma hash table teórica. E algo > próximo a isso, dependendo da razão número de buckets/número de elementos na > tabela na prática.
As variáveis booleanas nos métodos de pesquisa são desnecessárias. Você simplesmente deve retornar true caso encontre, e false no final do método. Seus métodos de remoção fazem trabalho de português: Primeiro vc itera na lista toda pra buscar se o elemente existe. Depois, caso exista, você itera mais uma vez para mandar remover. Oo
> Você deveria parar de retornar Strings e simplesmente retornar true ou > false, quem chamou esse método é que deve montar a mensagem.
> 2008/4/4 Arthur Gouveia <arthur.gouv...@gmail.com>:
> > Bom, seguindo o que foi dito aqui, alterei meu código...
> > Os métodos de "Pesquisar" não são pra retornar os dados do usuário ou > > produto, mas sim para saber se são válidos: apenas retornar um true ou false > > para exibir uma mensagem de acordo com isso. É um projeto de uma cadeira da > > Universidade, e é desse modo que foi passado...
> > > 2008/4/3 Rodrigo C. L. <tapetedepada...@gmail.com>:
> > > > > * Iprodutos.remove(liv): 1/2 da lista é percorrida.
> > > > er... remove num hashset é O(1), não?
> > > Isso mesmo. Desculpem-me. O(1) usando uma hash table teórica. E algo > > próximo a isso, dependendo da razão número de buckets/número de elementos na > > tabela na prática.
Além disso: - o método não deveria se chamar "pesquisar" e sim algo do tipo "existe". - na iteração dentro do while você usa uma variável chamada "usr" suponho que ela seja uma variável do objeto mas, se o usuário não existir a será guardado como valor desta variável o último usuário da coleção, ficando assim o objeto com um estado inconsistente.
> Você deveria parar de retornar Strings e simplesmente retornar true ou > false, quem chamou esse método é que deve montar a mensagem.
> 2008/4/4 Arthur Gouveia <arthur.gouv...@gmail.com>: > > Bom, seguindo o que foi dito aqui, alterei meu código...
> > Os métodos de "Pesquisar" não são pra retornar os dados do usuário ou > > produto, mas sim para saber se são válidos: apenas retornar um true ou > false > > para exibir uma mensagem de acordo com isso. É um projeto de uma cadeira > da > > Universidade, e é desse modo que foi passado...
> Além disso: > - o método não deveria se chamar "pesquisar" e sim algo do tipo "existe". > - na iteração dentro do while você usa uma variável chamada "usr" suponho > que ela seja uma variável do objeto mas, se o usuário não existir a será > guardado como valor desta variável o último usuário da coleção, ficando > assim o objeto com um estado inconsistente.
> > Você deveria parar de retornar Strings e simplesmente retornar true ou > > false, quem chamou esse método é que deve montar a mensagem.
> > 2008/4/4 Arthur Gouveia <arthur.gouv...@gmail.com>: > > > Bom, seguindo o que foi dito aqui, alterei meu código...
> > > Os métodos de "Pesquisar" não são pra retornar os dados do usuário ou > > > produto, mas sim para saber se são válidos: apenas retornar um true ou > > false > > > para exibir uma mensagem de acordo com isso. É um projeto de uma > > cadeira da > > > Universidade, e é desse modo que foi passado...
> > Além disso: > > - o método não deveria se chamar "pesquisar" e sim algo do tipo "existe". > > - na iteração dentro do while você usa uma variável chamada "usr" suponho > que ela seja uma variável do objeto mas, se o usuário não existir a será > guardado como valor desta variável o último usuário da coleção, ficando > assim o objeto com um estado inconsistente.
> > > Você deveria parar de retornar Strings e simplesmente retornar true ou > > > false, quem chamou esse método é que deve montar a mensagem.
> > > 2008/4/4 Arthur Gouveia <arthur.gouv...@gmail.com>:
> > > > Bom, seguindo o que foi dito aqui, alterei meu código...
> > > > Os métodos de "Pesquisar" não são pra retornar os dados do usuário ou > > > > produto, mas sim para saber se são válidos: apenas retornar um true ou > false > > > > para exibir uma mensagem de acordo com isso. É um projeto de uma > cadeira da > > > > Universidade, e é desse modo que foi passado...
> > > Além disso: > > > - o método não deveria se chamar "pesquisar" e sim algo do tipo > "existe". > > > - na iteração dentro do while você usa uma variável chamada "usr" > suponho > > que ela seja uma variável do objeto mas, se o usuário não existir a será > > guardado como valor desta variável o último usuário da coleção, ficando > > assim o objeto com um estado inconsistente.
> > > > Você deveria parar de retornar Strings e simplesmente retornar true > ou > > > > false, quem chamou esse método é que deve montar a mensagem.
> > > > 2008/4/4 Arthur Gouveia <arthur.gouv...@gmail.com>:
> > > > > Bom, seguindo o que foi dito aqui, alterei meu código...
> > > > > Os métodos de "Pesquisar" não são pra retornar os dados do usuário > ou > > > > > produto, mas sim para saber se são válidos: apenas retornar um > true ou > > false > > > > > para exibir uma mensagem de acordo com isso. É um projeto de uma > > cadeira da > > > > > Universidade, e é desse modo que foi passado...
Mas o ideal mesmo era fazer como o Joshua falou e implementar os métodos equals() e hashCode() nos seus objetos, se é que você ainda se lembra do porque de fazer isso =P
2008/4/4 Arthur Gouveia <arthur.gouv...@gmail.com>:
> É que eu gostaria de deixar apenas 1 return por método...
Se você implementar equals e hashCode ainda vai poder usar o contains da coleção. Utilizando apenas um return por método e ainda utilizando sobrecarga de métodos poderia ficar assim:
public boolean remover(Produto produto) { return lprodutos.remove(produto); }
public boolean remover(Usuario usuario) { return lusuarios.remove(usuario); }
public boolean existe(Usuario usuario) { return lusuarios.contains(usuario); }
public boolean existe(Produto produto) { return lprodutos.contains(produto); }
Mas ao contrário do Maurício eu acho que um return por método em casos como esse complica em vez de ajudar.
> Mas o ideal mesmo era fazer como o Joshua falou e implementar os > métodos equals() e hashCode() nos seus objetos, se é que você ainda se > lembra do porque de fazer isso =P
> 2008/4/4 Arthur Gouveia <arthur.gouv...@gmail.com>: > > É que eu gostaria de deixar apenas 1 return por método...