2012-10-01 17 views
6

Ho un Set di oggetti costosi.Ottenere un elemento da un set Java

Questi oggetti hanno ID e lo equals utilizza questi ID per l'uguaglianza.

Il tipo di questi oggetti ha due costruttori; uno per l'oggetto costoso e uno che imposta semplicemente l'ID.

Quindi posso verificare se un ID specifico è nello Set utilizzando Set.contains(new Object(ID)).

Tuttavia, dopo aver determinato l'oggetto è nel set, non è possibile ottenere l'istanza dell'oggetto nel set.

Come posso ottenere l'oggetto esatto che contiene il set?

risposta

4

Considerare l'utilizzo della classe UnifiedSet in Eclipse Collections (in precedenza GS Collections). Implementa l'interfaccia Pool oltre a Set. Pool aggiunge API map-like per mettere e ottenere. Il pool ha una memoria più efficiente di Map poiché non riserva la memoria per i valori, solo le chiavi.

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

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

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

Nota: Sono un committer per Eclipse collezioni.

2

Se HashMap con ID come chiavi non funzionerebbe, quindi userei un HashMap con il tuo oggetto sia come chiave e valore.

4

Se si desidera get da una raccolta, è necessario utilizzare una mappa.

(nota più Set implementazioni sono wrapper per una mappa)

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

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

Nel tuo caso, la chiave e il valore può essere dello stesso tipo, ma che è generalmente una cattiva idea, come le chiavi, come elementi di un insieme , dovrebbe essere immutabile.

+0

Suppongo che la chiave sia un sottoinsieme di campi del valore. Se la chiave viene derivata dal valore in questo modo e non è possibile avere chiavi duplicate, non sarà possibile avere valori duplicati. –

0

È potrebbe utilizzare un FilterIterator da Apache Commons Collezioni:

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

Ovviamente questo sarà un modo costoso di accedervi, ma se si sta fisso su utilizzando un Set, si avrà per iterarlo ad un certo punto.

1

Ecco un trucco che puoi fare per ottenere ciò che desideri. Fondamentalmente quando si utilizza contiene per cercare all'interno di un hashset, il metodo equals dell'oggetto che si sta cercando verrà chiamato quando i codici hash corrispondono. Supponendo che tu abbia a che fare con oggetti tuoi o con quelli che puoi estendere, è banale impostare un "segnale di beacon";) campo statico della classe con il riferimento che è stato appena identificato. E qui vai, puoi chiamare contiene e se viene restituito true, recupera l'oggetto;)

P.S. non giudicarmi

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

Questo è così orribile, ma mi ha fatto sorridere:) –

Problemi correlati