2012-10-01 19 views
6

Tengo un Set de objetos caros.Obtiene un artículo de un conjunto Java

Estos objetos tienen ID y el equals usa estos ID para la igualdad.

El tipo de estos objetos tiene dos constructores; uno para el objeto costoso, y uno que solo establece la ID.

Así puedo verificar si hay una ID particular en el Set usando Set.contains(new Object(ID)).

Sin embargo, habiendo determinado que el objeto está en el conjunto, no puedo obtener la instancia del objeto en el conjunto.

¿Cómo puedo obtener el objeto exacto que contiene el conjunto?

Respuesta

4

Considere utilizar la clase UnifiedSet en Eclipse Collections (anteriormente GS Collections). Implementa la interfaz Pool además de Set. Pool agrega API tipo mapa para put y get. Pool es más eficiente en cuanto a la memoria que Map, ya que no reserva memoria para valores, solo claves.

UnifiedSet<Integer> pool = UnifiedSet.newSet(); 

Integer integer = 1; 
pool.add(integer); 

Assert.assertSame(integer, pool.get(new Integer(integer))); 

Nota: soy un committer para colecciones de Eclipse.

2

Si HashMap con id's como claves no funcionaría, entonces usaría un HashMap con su objeto como clave y valor.

4

Si desea get de una colección, debe utilizar un Mapa.

(Nota más Set implementaciones son envoltorios para un mapa)

Map<Key, Value> map = new .... 

Value value = map.get(new Key(ID)); 

En su caso, la clave y el valor pueden ser del mismo tipo, pero que es generalmente una mala idea como claves, como elementos de un conjunto , debe ser inmutable.

+0

Supongo que la clave es un subconjunto de campos del valor. Si la clave se deriva del valor de esta manera y no puede tener claves duplicadas, tampoco podrá tener valores duplicados. –

0

Usted podría utilizar un FilterIterator de Apache Commons Colecciones:

Predicate eq = new EqualPredicate(new Object(ID)); 
FilterIterator filter = new FilterIterator(set.iterator(), eq); 
Object o = (Object) filter.next(); 

Obviamente, esto va a ser una manera costosa de acceder al mismo, pero si usted está fija en el uso de un Set, tendrá para iterarlo en algún punto.

1

Aquí hay un truco que puedes hacer para obtener lo que quieres. Básicamente cuando usas contiene para buscar dentro de un hashset, se llamará al método igual del objeto que estás buscando cuando los códigos hash coincidan. Suponiendo que se trata de objetos propios o que puede ampliar, es trivial establecer un campo estático de la clase con la referencia que se acaba de equiparar. Y aquí va, puede llamar a contains y si se devuelve true, recuperar el objeto;)

P.S. no me juzgue

import java.util.HashSet; 
import java.util.Set; 

public class BecauseWhyNot { 

    public static void main(String[] args) { 

     Set<Poop> sewage = new HashSet<Poop>(); 

     set.add(new Poop("Morning Delight")); 
     set.add(new Poop("Hangover Doodle")); 

     System.out.println("Contains Fire Drill?: " 
      + set.contains(new Poop("Fire Drill"))); 
     System.out.println("Contains Morning Delight?: " 
      + set.contains(new Poop("Morning Delight"))); 

     if (Poop.lastlySmelled != null) 
      System.out.println("It's you lucky day: " + Poop.lastlySmelled); 
     else 
      System.out.println("Sorry, try again ;)"); 
    } 

    public static class Poop { 
     static Poop lastlySmelled = null; 

     String description; 

     Poop(String desc) { 
      description = desc; 
     } 

     @Override 
     public int hashCode() { 
      return 900913 * description.hashCode(); 
     } 

     @Override 
     public boolean equals(Object obj) { 
      lastlySmelled = (Poop) this; 
      if (this == obj)   return true; 
      if (obj == null)   return false; 
      if (getClass() != obj.getClass()) return false; 
      Poop other = (Poop) obj; 
      if (description == null) { 
       if (other.description != null) 
        return false; 
      } else if (!description.equals(other.description)) 
       return false; 
      return true; 
     } 

     public String toString() { 
      return "Poop: " + description + "!"; 
     } 
    } 
+0

Esto es tan horrible, pero me hizo sonreír:) –

Cuestiones relacionadas