LinkedList

1 resposta
E

Como como eu faço para remover um campo especifico de uma LinkedList??
tipo tenho uma lista de arestas que contém várias arestas ,cada aresta e um nodo da minha lista e dentro desse nodo tem suas propriedades,
minha idéia e a seguinte, o programa pega o peso da aresta que o usuário dígito e verifica na lista a qual aresta pertence e deleta a aresta correspondente, mas isto não vai dar certo porque posso ter duas arestas com mesmo peso, intão a única solução e o usuário dígitar o vértice de origem e de destino e o método que remove as arestas encontre a aresta correspondente e delete a mesma, mas como posso fazer isto lembrando que minha lista de aresta é LinkedList e tem várias propriedades

private LinkedList<Aresta> arestas; // lista de arestas
arestas.remove(chama.getPegaAresta(vo, vd))//esté método remove mas não remove certo como eu disse só devo remover que eu passar o vértice de origem e de destino

como o programa pode localizar a propriedade vo e vd e deletar a arestas correspodente a o respectivo vo e vd…?
A ESTRUTURA QUE ESTOU USANDO E UM GRAFO.

1 Resposta

L

Solução 1, nessa eu implemento o método equals e hashcode de Aresta, e crio um construtor em Aresta só para setar os campos “key” dela.

import java.util.LinkedList;

public class Teste
{
   static class Vertice
   {

   }

   static class Aresta
   {
      private Vertice origem;
      private Vertice destino;
      private int peso;

      public Aresta (Vertice origem, Vertice destino, int peso)
      {
         this.origem = origem;
         this.destino = destino;
         this.peso = peso;
      }

      public Aresta (Vertice origem, Vertice destino)
      {
         this.origem = origem;
         this.destino = destino;
      }

      public int getPeso()
      {
         return peso;
      }

      /*
       * (non-Javadoc)
       * 
       * @see java.lang.Object#hashCode()
       */
      @Override
      public int hashCode()
      {
         final int PRIME = 31;
         int result = 1;
         result = PRIME * result + ((destino == null) ? 0 : destino.hashCode());
         result = PRIME * result + ((origem == null) ? 0 : origem.hashCode());
         return result;
      }

      /*
       * (non-Javadoc)
       * 
       * @see java.lang.Object#equals(java.lang.Object)
       */
      @Override
      public boolean equals(Object obj)
      {
         if (this == obj) return true;
         if (obj == null) return false;
         if (getClass() != obj.getClass()) return false;
         final Aresta other = (Aresta) obj;
         if (destino == null)
         {
            if (other.destino != null) return false;
         }
         else if (!destino.equals(other.destino)) return false;
         if (origem == null)
         {
            if (other.origem != null) return false;
         }
         else if (!origem.equals(other.origem)) return false;
         return true;
      }

   }

   public static void main(String[] args)
   {
      Vertice v1 = new Vertice();
      Vertice v2 = new Vertice();
      Vertice v3 = new Vertice();
      Vertice v4 = new Vertice();
      Vertice v5 = new Vertice();

      LinkedList<Aresta> list = new LinkedList<Aresta>();
      list.add(new Aresta(v1, v2, 3));
      list.add(new Aresta(v2, v3, 6));
      list.add(new Aresta(v3, v4, 4));
      list.add(new Aresta(v4, v5, 8));

      int ix = list.indexOf(new Aresta(v4, v5));
      if (ix >= 0)
      {
         Aresta rem = list.remove(ix);
         System.out.println("Aresta com peso " + rem.getPeso() + " removida");
      }
      else
         System.out.println("Aresta não encontrada.");

   }
}

Solução 2, nessa eu não quero implementar equals e hashcode ai faço o método de busca, provavelmente mais lento

import java.util.LinkedList;

public class Teste
{
   static class Vertice
   {

   }

   static class Aresta
   {
      private Vertice origem;
      private Vertice destino;
      private int peso;

      public Aresta (Vertice origem, Vertice destino, int peso)
      {
         this.origem = origem;
         this.destino = destino;
         this.peso = peso;
      }

      public int getPeso()
      {
         return peso;
      }

      static Aresta indexOfAresta(List<Aresta> list, Vertice origem, Vertice dest)
      {
         for (Aresta aresta : list)
         {
            if ((aresta.destino.equals(dest)) && (aresta.origem.equals(origem))) return aresta;
         }
         return null;
      }
   }

   public static void main(String[] args)
   {
      Vertice v1 = new Vertice();
      Vertice v2 = new Vertice();
      Vertice v3 = new Vertice();
      Vertice v4 = new Vertice();
      Vertice v5 = new Vertice();

      LinkedList<Aresta> list = new LinkedList<Aresta>();
      list.add(new Aresta(v1, v2, 3));
      list.add(new Aresta(v2, v3, 6));
      list.add(new Aresta(v3, v4, 4));
      list.add(new Aresta(v4, v5, 8));

      Aresta rem = Aresta.indexOfAresta(list, v2, v3);
      if (rem != null)
      {
         list.remove(rem);
         System.out.println("Aresta com peso " + rem.getPeso() + " removida");
      }
      else
         System.out.println("Aresta não encontrada.");

   }
}

Só existe essas formas de fazer?! não sei. São as melhores soluções?! não sei. Você usa uma delas?! não sei ehhehe
Da para criar uma solução usando Collections.binarySearch tb.

Ve ai… se gosta, ou espera que outra pessoa pode postar algo melhor.

Valeu

Criado 24 de abril de 2007
Ultima resposta 24 de abr. de 2007
Respostas 1
Participantes 2