2013-03-07 4 views
1

J'ai deux classes comme suit:Comment mettre à jour un élément dans un ensemble qui se trouve dans un autre ensemble?

public class State { 
    private static long count = 0; 
    private long StateNo; 
    private Set<Arc> arcs; 
} 

public class Arc { 
    private char charecter; 
    private State destState; 
    private Set<String> letters; 
} 

Maintenant, la classe Lexicon a mis des états et chaque état à son tour, a un ensemble d'arcs. Ma question est comment mettre à jour un arc particulier dans l'ensemble des arcs dans l'état particulier dans les états définis? (Mise à jour signifiant que je dois ajouter une lettre à l'ensemble des lettres dans cet arc.)

+0

Avez-vous une référence à l'état que vous devez mettre à jour? –

+0

Un état correct peut être identifié par l'état Non, count est la variable statique qui conserve l'état unique. –

+0

Dans ce cas, je suis d'accord avec les réponses recommandant l'utilisation de Map. Plus précisément, vous devriez avoir une carte que vous pouvez utiliser pour trouver un état donné son étatNo. De même, vous devez décider comment trouver l'Arc que vous voulez changer, étant donné un État. –

Répondre

0

Voulez-vous dire quelque chose comme ça?

public class Lexicon { 
    class State { 
     public long count = 0; 
     public long stateNo; 
     public Set<Arc> arcs; 
    } 

    class Arc { 
     public char character; 
     public State destState; 
     public Set<String> letters; 
    } 

    Set<State> states = new HashSet<State>(); 

    public void update(long stateNo, char character, String letter) { 
     for (State state : states) { 
      if(state.stateNo == stateNo) { 
       for (Arc arc : state.arcs) { 
        if (arc.character == character) { 
         arc.letters.add(letter); 
         break; 
        } 
       } 
       break; 
      } 
     } 
    } 
} 

Si oui, vous feriez mieux de le réécrire en utilisant cartothèque:

public class Lexicon { 
    class State { 
     public long count = 0; 
     public long stateNo; 
     public Map<Character, Arc> arcs; 

     public void updateArc(char character, String letter) { 
      Arc arc = arcs.get(character); 
      if (arc != null) { 
       arc.letters.add(letter); 
      } 
     } 
    } 

    class Arc { 
     public char character; 
     public State destState; 
     public Set<String> letters; 
    } 

    Map<Long, State> states = new HashMap<Long, State>(); 

    public void update(long stateNo, char character, String letter) { 
     State state = states.get(stateNo); 
     if (state != null) { 
      state.updateArc(character, letter); 
     } 
    } 
} 

Bien sûr, ce projet est seulement et vous pilonnement pour initialiser toutes les collections. Tous les champs sont également déclarés publics uniquement pour des raisons de clarté.

+0

Cela a aidé, merci beaucoup –

0

Set n'est pas une collection d'accès direct.

Je pense qu'il est préférable pour vous d'utiliser HashMap au lieu de ceux set s, où vous pouvez obtenir un objet directement par clé.

+0

Comment vais-je stocker les Arcs dans une carte, je veux dire, quelle sera la clé et la valeur? Comment cela aidera-t-il à accéder aux éléments?Dois-je stocker les états dans Map aussi bien dans la classe Lexicon? –

+0

Vous pouvez ajouter une propriété de clé et la rendre unique. Si vous devez accéder à un objet de cette manière, vous devez utiliser Map et voir comment ajuster votre code. Comment identifiez-vous l'arc et l'état à mettre à jour? – BobTheBuilder

+0

Si vous remarquez, la classe State a un étatNo comme une variable qui aidera à trouver l'état unique. La variable count dans State class est statique et prend en charge l'état uniqueNo. L'arc est représenté par une chaîne de caractère unique. Chaque État aura un arc avec une chaîne de caractère unique entre a-z. Je suis en train de construire un lexique pour scrabble en utilisant l'algorithme GADDAG. L'algorithme est expliqué avec le pseudo code ici http://www.ericsink.com/downloads/faster-scrabble-gordon.pdf –

1

Vous disposez d'un ensemble d'objets mutables.

Un problème à prendre en compte est que, si le changement Arc.letters peut affecter le résultat de Arc.equals(), vous devez faire attention lors de l'utilisation d'un Set<Arc>.

De l'documentation:

Note: Un grand soin doit être exercé que si les objets mutables sont utilisés comme éléments de l'ensemble. Le comportement d'un ensemble n'est pas spécifié si la valeur d'un objet est modifiée d'une manière qui affecte les comparaisons égales alors que l'objet est un élément de l'ensemble. Un cas particulier de cette interdiction est qu'il n'est pas permis à un ensemble de se contenir en tant qu'élément.

En particulier, cela signifie que vous devez supprimer l'élément de State.arcs, le modifier, puis ré-insérer dans State.arcs. De votre question, il semblerait que vous feriez mieux de arcs un Map plutôt qu'un Set. D'une part, vous seriez capable de regarder les choses par clé, ce que vous ne pouvez pas faire pour le moment.

+0

Comment vais-je stocker les Arcs dans une carte, je veux dire, quelle sera la clé et la valeur? Comment cela aidera-t-il à accéder aux éléments? Dois-je stocker les états dans Map aussi bien dans la classe Lexicon? –

Questions connexes