LinkedList

Boa noite amigos,

Tenho uma dúvida e não sei como resolver…

posso o seguinte código:

    public class Item
   {
      private String id;
      private String nome;
      private List<Item> itens;

      public Item(String id, String nome)
      {
          this.id = id;
          this.nome = nome;
          itens = new ArrayList<Item>();
       }

      //getters and setters
      ...
   }

    public class Teste
    {
         private Item item;
        
         //getters and setters
         ... 
         
         public void incluir()
         {
             item.add(new Item("1","UM");
             item.add(new Item("2","DOIS");
             item.add(new Item("3","TRÊS");
             item.add(new Item("4","QUATRO");
             item.add(new Item("5","CINCO");
             item.getItens.add(new Item("6", "SEIS");
             item.getItens.add(new Item("7", "SETE");
          } 
    }

Como posso achar um determinado item na minha lista sem ter que percorrê-la totalmente, incluindo os subitens ?

grande abraço à todos.


if(list.contains(item)) {
     System.out.println("Item encontrado");
} else {
     System.out.println("Item não encontrado");
}

[quote=wesley][code]

if(list.contains(item)) {
System.out.println(“Item encontrado”);
} else {
System.out.println(“Item não encontrado”);
}

[/code][/quote]

Mas como será feita essa comparação ?
Depois de populada a minha lista, eu posso criar por exemplo:

Item item = new Item("2", "DOIS"); if(list.contains(item)) { System.out.println("Item encontrado"); } else { System.out.println("Item não encontrado"); }

Com o LinkedList, não tem muita alternativa.

Como você está usando um ArrayList e não um LinkedList, e seus itens são ordenados, você tem a alternativa de usar o método Collections.binarySearch:
http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#binarySearch(java.util.List,%20T)

(É possível usar com LinkedList também, mas a performance poderá ser menor do que a de percorrer a lista item-a-item).

Outra alternativa, se você for usar coleções ordenadas, é trocar sua ArrayList por um TreeSet, pois seu método contains é virtualmente instantâneo, e ele já proíbe duplicatas naturalmente.

O método contains, indicado pelo colega, também percorre item-a-item listas. Ele só é eficiente em sets e maps.

Nos Lists, a comparação é feita através do método equals da sua classe.

No HashSet e no HashMap, o hashCode é usado antes do equals, para otimizar a busca.

No TreeMap e no TreeSet, usa-se os comparators.

Nos Lists, a comparação é feita através do método equals da sua classe.

No HashSet e no HashMap, o hashCode é usado antes do equals, para otimizar a busca.

No TreeMap e no TreeSet, usa-se os comparators.[/quote]

Deixa ver se eu entendi…
Posso trocar a minha lista por um TreeSet e depois executar o método contains ?

tipo:

      TreeSet<Item> lista = new TreeSet<Item>();
      //populo a minha lista

      //e lá pelas tantas...
      Item item = new Item("5", "CINCO");
      if (lista.contains(item)).....

Posso fazer parecido com isso ?

abraços

Sim. Pra popular uma coleção com o conteúdo de outra, basta passar a coleção no construtor:

TreeSet<Item> set = new TreeSet<Item>(suaLista);

Lembre-se que, por ser um set, todas os itens duplicados serão imediatamente descartados na cópia. Só um exemplar irá sobrar.