Ilustres!
Estou com um problema em tese simples, mas estou quebrando a cabeça pra resolver, faz tempo que não trabalho com java ![:confused: :confused:](https://www.guj.com.br/images/emoji/twitter/confused.png?v=9)
Vamos lá, tenho uma classe Categoria que possui subcategorias armazenadas dentro de um arraylist… até aí tudo bem:
public class Categoria implements Serializable {
private String titulo;
private String descricao;
private ArrayList<Produto> produtos;
private ArrayList<Categoria> subCategorias;
//.....//
}
Daí na hora de buscar uma categoria pelo titulo, pensei em linearizar todas elas em um novo array list, e aqui está o problema:
public Categoria pesquisarCategoria(String titulo){
Categoria ret = null;
ArrayList<Categoria> todas = new ArrayList<Categoria>(categorias);
for(Categoria aux : todas){
todas.addAll(aux.getSubCategorias());
}
for(Categoria aux: todas){
if(aux.getTitulo().equals(titulo)){
return aux;
}
}
return ret;
}
Erro:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at pkgCatalogo.SingletonCatalogo.pesquisarCategoria(SingletonCatalogo.java:65)
at trabalhooo.Sistema.pesquisarCategoria(Sistema.java:59)
at trabalhooo.TrabalhoOO.main(TrabalhoOO.java:254)
Alguma luz?
![:smiley: :smiley:](https://www.guj.com.br/images/emoji/twitter/smiley.png?v=9)
Grato desde já!
Veja se ajuda:
public Categoria pesquisarCategoria(String titulo){
Categoria ret = null;
List<Categoria> todas = new ArrayList<Categoria>(categorias);
for(Categoria aux : categorias){ //percorro a list categorias e NAO o novo list todas !!!!
todas.addAll(aux.getSubCategorias());
}
for(Categoria aux: todas){
if(aux.getTitulo().equals(titulo)){
return aux;
}
}
return ret;
}
Olhando pela lógica não funcionaria amigo, ele não chegaria a "terceira camada " de Categorias ![:confused: :confused:](https://www.guj.com.br/images/emoji/twitter/confused.png?v=9)
Podes usar recursividade.
Veja o método “getTodosItens”
import java.util.ArrayList;
import java.util.List;
public class ItemComSubItem {
private String nome;
private List<ItemComSubItem> subItens;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<ItemComSubItem> getSubItens() {
return subItens;
}
public void setSubItens(List<ItemComSubItem> subItens) {
this.subItens = subItens;
}
public void addSubItem(ItemComSubItem subItem){
if(getSubItens() == null){
setSubItens(new ArrayList<ItemComSubItem>());
}
getSubItens().add(subItem);
}
public boolean possuiItens(){
return getSubItens() != null && getSubItens().size() > 0;
}
public List<ItemComSubItem> getTodosItens(){
List<ItemComSubItem> todosItens = new ArrayList<ItemComSubItem>();
if (possuiItens()){
for (ItemComSubItem itemComSubItem : getSubItens()) {
todosItens.addAll(itemComSubItem.getTodosItens());
}
}
todosItens.add(this);
return todosItens;
}
public boolean possuiItem(ItemComSubItem itemComSubItem){
for (ItemComSubItem item : getTodosItens()) {
if (item.getNome().equals(itemComSubItem.getNome())){
return true;
}
}
return false;
}
public static void main(String[] args) {
ItemComSubItem item1 = new ItemComSubItem();
item1.setNome("1");
ItemComSubItem item2 = new ItemComSubItem();
item2.setNome("1.1");
item1.addSubItem(item2);
ItemComSubItem item3 = new ItemComSubItem();
item3.setNome("1.1.1");
item2.addSubItem(item3);
ItemComSubItem item4 = new ItemComSubItem();
item4.setNome("1.1.2");
item2.addSubItem(item4);
List<ItemComSubItem> todos = item1.getTodosItens();
for (ItemComSubItem itemComSubItem : todos) {
System.out.println(itemComSubItem.getNome());
}
}
}