Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    generare un vettore i cui elementi puntano a coppie di valori

    Salve ragazzi.. ... io ho creato un vettore in cui inserisco degli elementi e vorrei che ogni elemento del vettore punti ad una o più coppie di valori interi, ma non sò proprio quale struttura dati (ArrayList, vector, liste, code, pile etc etc) faccia al caso mio.
    Per il vettore degli elementi io avevo pensato ad una ArrayList, ma la prof.ssa mi ha consigliato un vector, voi che ne dite?
    Inoltre, per le coppie di elementi che struttura dati potrei usare?
    cioè c'è una struttura dati che mi permette di memorizzare una coppia di valori (x,y)?
    in pseudo-codice ho pensato:
    codice:
    ArrayList lista = new ArrayList(); 
    for( y = m-1; y >=0; y++){ 
        for( x = 0; x < n; x++){ 
            calcola c; 
            if( lista.contains(c)==false){ 
                 lista.add(c); 
                 memorizza il valore di x e y in modo che l'elemento c della lista punti a (x,y);
            }else { 
                 vuol dire che c è già presente nella lista e quindi punta già ad una o più coppie
                 (x,y), quindi vai nella posizione della lista in cui c'è c ed "aggancia" (x,y) all'ultima
                 coppia (x,y) a cui punta quel c;
            }
         }
    }
    Grazie in anticipo!!!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Per l'array, sinceramente non capisco perchè usare Vector (che è synchronized) al posto di un più agevole ArrayList, ma tant'è... non fa differenza.

    Per la coppia, creati una classe Coppia che incapsuli due interi. E' di una banalità incredibile. Trovi esempi di tale classe anche qui sul forum.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie mille!!!

  4. #4
    Ma è possibile anche memorizzare più di una coppia di valori (x,y) per ogni cella dell'ArrayList?
    E come posso fare a far puntare a quell'elemento c in arrayList la coppia o le coppie?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    In un ArrayList ci metti tutte le istanze degli oggetti che vuoi... puoi creare tante istanze della tua classe Coppia e inserirle nell'ArrayList... il resto non ho capito cosa voglia dire.


    codice:
    ArrayList<Coppia> lista = new ArrayList<Coppia>();
    lista.add( new Coppia(5, 6) );   // Inserisco la coppia (5, 6)
    lista.add( new Coppia(1, 2) );   // Inserisco la coppia (1, 2)
    lista.add( new Coppia(3, 8) );   // Inserisco la coppia (3, 8)
    ...
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Quello che intendevo dire è che il calcolo di c nel codice:
    codice:
    ArrayList lista = new ArrayList();  
       for( y = m-1; y >=0; y++){
          for( x = 0; x < n; x++){
               c = -x + 2*y;
               if( lista.contains(c)==false){
                   lista.add(c);
                  e memorizza il valore di x e y in modo che la coppia (x,y) sia associata a quel c;
               }else {
                   vuol dire che c è già presente nella lista e quindi ha già associate una o più
                   coppie (x,y) quindi memorizza la nuova coppia (x2,y2) in coda a quelle già presenti
                   nello stesso valore di c;
               }
          }
      }
    mi serve perchè se c è presente nella lista, vuol dire che c'è già una coppia (x,y) associata a quel valore di c e quindi dovrei memorizzare la nuova coppia (x2,y2) nella stessa posizione di quella già memorizzata.
    cerco di farti un esempio graficamente, seguendo lo pseudo-codice sopra:
    lista (x , y)
    6 (0 , 3)
    5 (1 , 3)
    4 (2 , 3) (0 , 2) // qui vedi ci sono 2 coppie associate allo stesso valore
    3 (3 , 3) (1 , 2)
    2 (2 , 2) (0 , 1)
    1 (3 , 2) (1 , 1)
    0 (2 , 1) (0 , 0)
    -1 (3 , 1) (1 , 1)
    -2 (2 , 0)
    -3 (3 , 0)
    NB. I valori in lista sono i valori che assume c via via che viene calcolato nelle iterazioni dei due for.
    Se invece inserisco le coppie (x,y) come hai detto te, le inserirei in sequenza no?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Qui le cose cambiano un pochino (non avevo capito granché prima).

    Allora, conviene usare una struttura un po' più complessa, in particolare, questa:

    codice:
    HashMap<Integer, ArrayList<Coppia>>
    Ovvero una mappa che faccia corrispondere a ciascun intero (il tuo "c"), una lista di coppie: per lo più avrai liste da un elemento (una sola coppia), ma potresti avere liste con più elementi (più coppie).

    Il tuo "c" sarà un intero (un oggetto Integer) che funge da chiave per la mappa.

    Il lavoro andrà valutato con attenzione: al momento in cui generi questo "c" dovrai verificare se esiste una mappatura per tale "c". Se esiste, ottieni l'ArrayList di coppie corrispondente e aggiungi la nuova coppia. Se non esiste, crea un ArrayList, aggiungici la coppia appena trovata e crea la mappatura:

    codice:
    HashMap<Integer, ArrayList<Coppia>> mappa = new HashMap<Integer, ArrayList<Coppia>>();
    ...
    int c = ...   // Ottengo "c" con l'algoritmo che conosci tu
    
    // Verifico se c'è già una mappatura
    if( mappa.containsKey(c) ) {
       // C'è già una mappatura... ottengo l'ArrayList e aggiungo la nuova coppia
       ArrayList<Coppia> lista = mappa.get( c );
       lista.add( new Coppia(x, y) );
    } else {
       // Non c'è nessuna mappatura: la aggiungo
       ArrayList<Coppia> lista = new ArrayList<Coppia>();
       lista.add( new Coppia(x, y) );
       mappa.put(c, lista);
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Esattamente!!!.. Grazie, grazie infinte!!!.. per adesso è tutto moooolto più chiaro se qualcos'altro non mi quadra riscrivo nel post, per adesso grazie mille!!
    L'efficienza di questo forum è qualcosa di incredibile.
    Grandi ragazzi!!!

  9. #9
    é possibile, quando si fà il put(c, lista), inserire c in una posizione precisa (per esempio come si utilizza l'indice per inserire un elemento in un vettore)?
    Perchè ogni c dovrei inserirlo in una posizione precisa, calcolata attraverso:
    codice:
    index = max - c
    nell'esempio di codice che ho postato max = 6, ma non ho ben capito se con HashMap si può fare o no questo passaggio.

  10. #10
    Originariamente inviato da Carlitos84
    é possibile, quando si fà il put(c, lista), inserire c in una posizione precisa (per esempio come si utilizza l'indice per inserire un elemento in un vettore)?
    La coppia (c, lista) viene posizionata nella struttura secondo la funzione di hash definita, e ciò non ti deve interessare visto che il tuo scopo è quello di associare ad ogni c le relative coppie.

    Se invece vuoi ottenere una vista ordinata della struttura, allora puoi ordinare le chiavi (i valori c) in modo tale da indurre la visualizzazione della mappa.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.