Abstract Function HashMap

di Anonimizzato27370 il
5 risposte
Salve a tutti, ho concluso un progetto e come richiesta ho anche di fornire l'implementazione delle mie classi (Abstract Function e Rep Invariant). Sto trovando difficoltà nel definire la AF della mia HashMap<String, HashSet<E>>: ho una HashMap dove ogni String corrisponde a una serie (HashSet) di dati di tipo E.
Nella AF lo scopo è descrivere la struttura utilizzata usufruendo dei metodi di quest'ultima, dovrei descrivere una relazione del genere

HashMap <String, HashSet<E>> elements;

<elements.String_0 , elements.values() di 1 , <elements.String_1, elements.values() di 2> eccetera. Però non ho idea di come poterlo fare con il codice, l'HashMap non si comporta come una Lista, non so come prendere l'elemento String, uno per uno, e poi associarci tutti i valori nel campo di destra.

So che la domanda è confusionaria ma spero che qualcuno mi aiuterà.

5 Risposte

  • RussBear ha scritto:


    l'HashMap non si comporta come una Lista, non so come prendere l'elemento String, uno per uno
    Sì, HashMap non è una "lista". MA puoi ottenere:

    - il Set delle chiavi (su cui puoi iterare): keySet()
    - il Set delle entry (su cui puoi iterare): entrySet()
    - la Collection dei valori (su cui puoi iterare): values()

    Se è questo che intendevi ....
  • andbin ha scritto:


    RussBear ha scritto:


    l'HashMap non si comporta come una Lista, non so come prendere l'elemento String, uno per uno
    Sì, HashMap non è una "lista". MA puoi ottenere:

    - il Set delle chiavi (su cui puoi iterare): keySet()
    - il Set delle entry (su cui puoi iterare): entrySet()
    - la Collection dei valori (su cui puoi iterare): values()

    Se è questo che intendevi ....
    Si so i comandi di HashMap, il problema è che non so come creare la relazione con quelli che ho a disposizione. Ti faccio un esempio di farei un AF con ArrayList, se per esempio avessi un tipo di dato Category<E> definito da un nome String e un ArrayList<Int> elements che contiene i suoi elementi, farei così la sua AF:

    AF(c) <c.getName() , {elements.get(i)}> con 0<=i<elements.size() DOVE getName() è un metodo che sarebbe appositamente creato per restituire il nome di Category<E>

    Come posso fare una cosa simile in HashMap? Mi servirebbe scannerizzare tutte le chiavi e "associarci" i valori e farlo poi con le restanti,
    Key_0 , valori di 0> eccetera ma con comandi della HashMap
  • La tua descrizione sinceramente e' un po confusionale ma se ti interessa semplicemente iterare per ogni chiave della HashMap (ricordando che l'ordine di iterazione NON e' garantito con HashMap) ti basta :
    
    for(Entry<String,HashSet<String>> entry : map.entrySet()){
    	HashSet<String> currSet = entry.getValue();
    	//oppure qualche azione sul set ?
    	currSet.add("elemento");
    }
    
    
    Come mai utilizzare un Set, hai bisogno esplicitamente di filtrare via duplicati? Altrimenti basta un ArrayList<String>.
  • magicsign ha scritto:


    La tua descrizione sinceramente e' un po confusionale ma se ti interessa semplicemente iterare per ogni chiave della HashMap (ricordando che l'ordine di iterazione NON e' garantito con HashMap) ti basta :
    
    for(Entry<String,HashSet<String>> entry : map.entrySet()){
    	HashSet<String> currSet = entry.getValue();
    	//oppure qualche azione sul set ?
    	currSet.add("elemento");
    }
    
    
    Come mai utilizzare un Set, hai bisogno esplicitamente di filtrare via duplicati? Altrimenti basta un ArrayList<String>.
    I duplicati sono esclusi, lo faccio anche tramite appositi controlli e poi lancio una eccezione. Ma il motivo per cui ho usato HashSet dentro l'HashMap è che devo usare strutture diverse per creare due implementazioni, e nella prima avevo usato solo ArrayList.
    Comunque quello che chiedevo non riguarda fare qualcosa sul codice, devo trovare un modo di esprimere la relazione tra gli elementi in notazione matematica/codice e metterla in un commento
  • Prova a mostrarci un esempio pratico anche con pseudocode perche' sinceramente non ho capito la relazione che stai cercando di esprimere
Devi accedere o registrarti per scrivere nel forum
5 risposte