ArrayList - modificação corrente

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:
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:

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:

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());
		}

	}


}