Togliere ripetizioni da lista di item

di il
3 risposte

Togliere ripetizioni da lista di item

Se ho una lista fatta da più item ( nome prodotto , codice , quantità ) alcuni dei quali hanno lo stesso nome prodotto , come posso fare per aggiornare la lista e togliere il "vecchio" item? per esempio se ho

(pane , 3 , 5 ) (cioccolata , 4, 6 ) (pasta , 2 , 2 ) (pane , 3 , 9 )
aggiornando la lista senza ripetizioni dovrei avere
(pane , 3 , 14 ) (cioccolata , 4, 6 ) (pasta , 2 , 2 )

ho provato a farlo scorrendo la lista ed estraendo a mano a mano un item. accedo al campo nome di quell'item e lo confronto con un altro campo item. se i campi nome dei due item sono uguali allora resetto il campo quantità con la quantità del primo + la quantità del secondo. poi rimuovo il secondo item dato che ho aggiornato il primo. il problema , ammesso che il mio ragionamento abbia un senso , è che non so come estrarre il secondo item dalla lista. mettendo Item it2 = L1.getValue() confronterò sempre due item uguali


for (L1.moveToStart(); L1.currPos() < L1.length(); L1.next()) {

		Item it = L1.getValue();

		if (it.getnome() == ) {
			
			it.setquantità(it.getquantità() + it2.getquantità());
		//	L1.remove(it2);
		}

		}
		
	

3 Risposte

  • Re: Togliere ripetizioni da lista di item

    Come negli altri thread: senza fornire informazioni complete non vai da nessuna parte

    Di solito si fa con una funzione ricorsiva: parti dal primo elemento, scorri la lista tenendo traccia dell'elemento precedente, quando trovi il doppione sommi quello che devi sommare al primo elemento, poi il puntatore al next dell'elemento precedente lo sovrascrivI con il puntatore al next dell'elemento corrente, cancelli l'elemento corrente.
    Se hai trovato il doppione, richiami la funzione ricorsiva ripartendo sempre dal primo elemento, altrimenti se arrivi a fine lista chiami la funzione ricorsiva passando al secondo elemento. Quando l'elemento iniziale è NULL hai finito.

    Come implementarlo in pratica non si può dire senza tutto il resto. Tra l'altro ci sono un milione di modi di implementare le liste in C++: se non sei vincolata, usa classi e template che lo standard ti mette a disposizione, senza stare a impazzire
  • Re: Togliere ripetizioni da lista di item

    
    For (L1.moveToStart(); L1.currPos() < L1.length(); L1.next()) {
    
    		Item it = L1.getValue();
    
    		int trovato = find(L1, it);
    
    
    		if (trovato != -1) {
    
    			L1.moveToPos(trovato); // mi posiziono nel punto dove ho trovato doppione
    
    			Item removed = L1.getValue(); // estraggo item da aggiornare 
    
    			removed.setquantità(removed.getquantità() + quantità);
    			L1.remove();
    			L1.insert(removed);
    
    
    		}
    
    		else L1.insert(it);
    
    	}
    	

    ho utilizzato la funzione find messa a disposizione del mio prof ma il ciclo for che ho aggiunto mi da problemi e la lista non viene stampata. utilizzando lo stesso codice ( funzione a parte , che non avendo scritto io è corretta ) in altri programmi funziona tutto correttamente
  • Re: Togliere ripetizioni da lista di item

    Devi fare moveToStart() e un next() prima del for, altrimenti è ovvio che troverai il primo elemento uguale a se stesso
Devi accedere o registrarti per scrivere nel forum
3 risposte