Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Opera Neon: il browser AI agentico di nuova generazione
Opera Neon: il browser AI agentico di nuova generazione
Abbiamo provato il nuovo web browser con intelligenza artificiale della serie Opera accessibile tramite abbonamento. Ecco le nostre prime impressioni sulle funzionalità di Opera Neon basate su AI e come funzionano
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-06-2008, 17:42   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
[Java] iterazione "doppia"

tramite una LinkedList vorrei realizzare un algoritmo banalissimo, una doppia iterazione su tutta la lista (come due for annidati in poche parole), ma non ci riesco perché le iterazioni prevedono la cancellazione occasionale di coppie di elementi

praticamente dovrei realizzare un algoritmo come quello che scrivo di seguito in pseudocodice:
Codice:
# L è una lista doppiamente linkata
for each A in L
	for each B in L
		if (A != B) AND <some other conditions>
			L <- L \ {A U B}  # rimuovi sia A che B
secondo voi è fattibili in Java tramite LinkedList e iteratori?
ho persino provato a reimplementare una mia AbstractSequentialList ma ho desistito presto: è troppo difficile da implementare perché è inutilmente complessa a causa di quell'idiotissimo sistema di indici che fa parte dell'interfaccia Collection
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 20:51   #2
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
ma se scorri la lista al contrario non risolvi?
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 21:05   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
ma se scorri la lista al contrario non risolvi?
non vedo perché dovrei...
mi fai un esempio?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 21:08   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
ma se scorri la lista al contrario non risolvi?
Uhm, se non ho capito male, scorrendo gli elementi A dall'inizio alla fine, e scorrendo gli elementi B dalla fine all'inizio? Potrebbe funzionare...
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 21:09   #5
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Uhm, se non ho capito male, scorrendo gli elementi A dall'inizio alla fine, e scorrendo gli elementi B dalla fine all'inizio? Potrebbe funzionare...
in java che io sappia è l'unico modo per cancellare degli elementi in una lista durante un'iterazione, e per me ha sempre funzionato..

EDIT: o meglio è il modo + semplice.
Un altro modo potrebbe essere quello di memorizzarsi gli indici degli elementi da eliminare ed eliminarli subito dopo la fine dell'iterazione.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 21:38   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ma se io modifico la lista tramite un altro iterator (quello che uso per cancellare gli elementi B) non dovrebbe venir lanciata una ConcurrentModificationException?

e poi non ho capito perché, usando due iteratori, col secondo dovrei andare dalla fine verso l'inizio
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 21:44   #7
feboss
Senior Member
 
L'Avatar di feboss
 
Iscritto dal: Sep 2006
Città: Catania
Messaggi: 742
in pratica devi scorrere la lista e cancellare tutti gli element che si ripetono?
__________________
Voglio sapere di che tessuto deve essere un discorso per non fare neanche una piega
Alternativa ai pacchi di NLITE
MacBook & Canon Ixus 80
feboss è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 22:00   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2780
Codice:
# L è una lista doppiamente linkata
for each A in L
	for each B in L
		if (A != B) AND <some other conditions>
			L <- L \ {A U B}  # rimuovi sia A che B
Non ho ben capito il problema, l'unica cosa che mi viene in mente è che in questo pseudocodice che hai scritto probabilmente manca un break dopo la cancellazione della coppia di elementi.
Per il resto, perché non dovrebbe funzionare? Dov'è il problema anche se cancelli qualche elemento?
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 22:01   #9
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7258
non puoi banalmente fare:
Codice:
for (Object a : list) {
	for (Object b : list) {
		if(whatever) {
			Object[] toRemove = {a, b};
			list.remove(toRemove);
		}
	}
}
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 22:12   #10
feboss
Senior Member
 
L'Avatar di feboss
 
Iscritto dal: Sep 2006
Città: Catania
Messaggi: 742
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
non puoi banalmente fare:
Codice:
for (Object a : list) {
	for (Object b : list) {
		if(whatever) {
			Object[] toRemove = {a, b};
			list.remove(toRemove);
		}
	}
}
Mi piace questo codice.Potresti per favore spiegarmi ogni istruzione?
perchè mi interessa particolarmente.se è possibile anche trasformando quel for, in un for normale
Tranne l'ultimo pezzo
Codice:
Object[] toRemove = {a, b};
			list.remove(toRemove);
grazie
__________________
Voglio sapere di che tessuto deve essere un discorso per non fare neanche una piega
Alternativa ai pacchi di NLITE
MacBook & Canon Ixus 80
feboss è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 22:43   #11
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7258
Quote:
Originariamente inviato da feboss Guarda i messaggi
Mi piace questo codice.Potresti per favore spiegarmi ogni istruzione?
perchè mi interessa particolarmente.se è possibile anche trasformando quel for, in un for normale
Tranne l'ultimo pezzo
Codice:
Object[] toRemove = {a, b};
			list.remove(toRemove);
grazie
niente si traduce con: per ogni oggetto a in list fai ecc... in questo modo la creazione dell'iteratore è implicita (funziona da java5 in poi)
potresti scriverlo così:
Codice:
for (Iterator i1 = list.iterator(); i1.hasNext();) {
	Object a = (Object) i1.next();
	for (Iterator i2 = list.iterator(); i2.hasNext();) {
		Object b = (Object) i2.next();
		if(...) {
			Object[] toRemove = {a, b};
			list.remove(toRemove);
		}
	}
}

Ultima modifica di k0nt3 : 29-06-2008 alle 22:47.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 23:20   #12
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
no, attenzione.
Con il metodo della cancellazione immediata senza memorizzazione degli indici degli oggetti da rimuovere non si può utilizzare un iteratore, ma bisogna scorrere la lista al contrario, e mi sembrava ovvio e scontato che l'unico modo per fare questo è utilizzando un ciclo for che parta dalla fine e decrementi l'indice di uno fino ad arrivare a zero.
Per la memorizzazione degli indici invece si può utilizzare la struttura che si preferisce per iterare sulla lista perchè tanto la cancellazione avviene solo in un momento successivo iterando sulla lista degli elementi da cancellare e eliminandoli dall'altra lista.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 23:24   #13
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
tradotto in codice:
Codice:
for (int i = lista.size() - 1; i >= 0; i--) {
    for (int j = lista.size() - 1; j >= 0; j--) {
        if (condition) {
            lista.remove(i);
            lista.remove(j);
        }
    }
}
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 29-06-2008, 23:48   #14
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
mmmm..
ora che ci penso con l'iterazione doppia non l'ho mai provata..
vabbè..
in caso non dovesse andare puoi sempre memorizzarti in una lista gli indici (o gli oggetti) da rimuovere e dopo aver finito l'iterazione iteri questa lista e li elimini dalla lista originaria.
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2008, 00:36   #15
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
Codice:
[...]
        if (condition) {
            lista.remove(i);
            lista.remove(j);
        }
[...]
Uhm, però così dovresti fare uno step su i ad ogni rimozione (altrimenti, dopo la prima, lista.remove(i) cosa va a rimuovere?), almeno ad occhio mi pare così.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2008, 00:37   #16
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Codice:
for (int i = lista.size() - 1; i >= 0; i--) {
    bool found = false;

    for (int j = lista.size() - 1; j >= 0; j--) {
        if (condition) {
            lista.remove(j);
            found = true;
        }
    }

    if (found) {
        lista.remove(i);
    }
}
Una cosa del genere?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2008, 09:22   #17
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Codice:
for (int i = lista.size() - 1; i >= 0; i--) {
    bool found = false;

    for (int j = lista.size() - 1; j >= 0; j--) {
        if (condition) {
            lista.remove(j);
            found = true;
        }
    }

    if (found) {
        lista.remove(i);
    }
}
Una cosa del genere?
Va bene solo se l'elemento j-esimo è sempre successivo all'elemento i-esimo; in caso contrario l'ultima istruzione (lista.remove(i)) opera su un indice *non più valido* [perchè prima verrebbe eseguito lista.remove[j] e se j precede i non va bene]
Ciò dipende dalla logica espressa in "if(condition)"...


La soluzione per me è iterare la lista linkata con tutti gli Iterator che si ritiene necessario per raccogliere in un'altra Collection gli indici degli elementi da rimuovere e rimuovere tutto alla fine, a parte.

Certo per valutare se la cosa è possibile e non porta via troppo tempo sarebbe utile sapere prima a cosa serve la lista linkata nel programma e che dimensioni può avere.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 30-06-2008 alle 09:25.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2008, 10:25   #18
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da feboss Guarda i messaggi
in pratica devi scorrere la lista e cancellare tutti gli element che si ripetono?
non proprio in verità, comunque si, per semplificare potremmo dire che devo cancellare una coppia di elementi (A, B), con A che precede B, se (A != B) && (A.equals(B))


Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Codice:
# L è una lista doppiamente linkata
for each A in L
	for each B in L
		if (A != B) AND <some other conditions>
			L <- L \ {A U B}  # rimuovi sia A che B
Non ho ben capito il problema, l'unica cosa che mi viene in mente è che in questo pseudocodice che hai scritto probabilmente manca un break dopo la cancellazione della coppia di elementi.
uh? no, dopo averli cancellati devo andare avanti e vedere se ci sono altre coppie da cancellare.


Quote:
Per il resto, perché non dovrebbe funzionare? Dov'è il problema anche se cancelli qualche elemento?
ConcurrentModificationException


Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
non puoi banalmente fare:
Codice:
for (Object a : list) {
	for (Object b : list) {
		if(whatever) {
			Object[] toRemove = {a, b};
			list.remove(toRemove);
		}
	}
}
ConcurrentModificationException
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2008, 10:33   #19
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
no, attenzione.
Con il metodo della cancellazione immediata senza memorizzazione degli indici degli oggetti da rimuovere non si può utilizzare un iteratore, ma bisogna scorrere la lista al contrario, e mi sembrava ovvio e scontato che l'unico modo per fare questo è utilizzando un ciclo for che parta dalla fine e decrementi l'indice di uno fino ad arrivare a zero.
Per la memorizzazione degli indici invece si può utilizzare la struttura che si preferisce per iterare sulla lista perchè tanto la cancellazione avviene solo in un momento successivo iterando sulla lista degli elementi da cancellare e eliminandoli dall'altra lista.
usare il sistema degli indici è una cosa che vorrei evitare: è un sistema totalmente idiota che trasforma l'operazione di cancellazione da una lista da O(1) a O(N)
non mi capacito di come sia possibile che gli autori del Collection Framework abbiano avuto un'idea così cretina

al limite piuttosto che cancellare per indice preferirei flaggare gli elementi da cancellare e fare quindi una cosa del genere:
Codice:
LinkedList<MyItem> originalList;

.
.
.

class ItemContainer
{
	public MyItem item;
	public boolean delete = false;

	public ItemContainer(MyItem item)
	{
		this.item = item;
	}

}

.
.
.

LinkedList<ItemContainer> copiedList = new LinkedList<ItemContainer>();
for (MyItem item : originalList)
{
	copiedList.add(new ItemContainer(item));
}

for (ItemContainer A : copiedList)
{
	for (ItemContainer B : copiedList)
	{
		if ((A != B) && (<some other conditions>))
		{
			A.delete = true;
			B.delete = true;
		}
	}
}

Iterator<ItemContainer> i = copiedList.iterator();
while (i.hasNext())
{
	if (i.next().delete)
	{
		i.remove();
	}
}

originalList.clear();
for (ItemContainer container : copiedList)
{
	originalList.add(container.item);
}
ma sinceramente mi sembra scandaloso, speravo in qualcosa di molto più semplice
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-06-2008, 10:36   #20
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
una condizione che forse può aiutare a risolvere il problema (anche se credo che non ci sia soluzione ) è che se esiste una coppia (A, B) di elementi da cancellare allora A nella lista precede B, e quindi l'iterazione interna non ha bisogno di esaminare anche tutti gli elementi che precedono A, ma può partire dal successore.
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
Super sconti sui Google Pixel: Pixel 10,...
Addio SRAM? La nuova tecnologia GCRAM pr...
La repubblicana Anna Paulina Luna chiede...
1.000 Hz, risoluzione HD Ready: il futur...
Polestar 4 legge la strada al tuo posto:...
Mercato auto in Italia: vola l'elettrico...
Gli AI browser aggirano i paywall: i cas...
MSI regala Football Manager 26 con sched...
Come va in casa Broadcom/VMware? Computa...
Startup Marathon 2025: chi sono le 12 az...
Spotify continua a dominare il mercato d...
Il settore delle eSIM 'da viaggio' regis...
TSMC potrebbe garantire un vantaggio a Q...
Samsung Exynos 2600 raggiunge prestazion...
Call of Duty: Black Ops 7, annunciato un...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:22.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v