|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
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
![]() 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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
ma se scorri la lista al contrario non risolvi?
__________________
|
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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! |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
![]() 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.
__________________
|
|
|
|
|
|
|
#6 |
|
Bannato
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
|
|
|
|
|
|
#7 |
|
Senior Member
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 |
|
|
|
|
|
#8 |
|
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
Per il resto, perché non dovrebbe funzionare? Dov'è il problema anche se cancelli qualche elemento? |
|
|
|
|
|
#9 |
|
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);
}
}
}
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Catania
Messaggi: 742
|
Quote:
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);
__________________
Voglio sapere di che tessuto deve essere un discorso per non fare neanche una piega Alternativa ai pacchi di NLITE MacBook & Canon Ixus 80 |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
Quote:
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. |
|
|
|
|
|
|
#12 |
|
Senior Member
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.
__________________
|
|
|
|
|
|
#13 |
|
Senior Member
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);
}
}
}
__________________
|
|
|
|
|
|
#14 |
|
Senior Member
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.
__________________
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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! |
|
|
|
|
|
#16 |
|
Senior Member
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);
}
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
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. |
|
|
|
|
|
|
#18 | ||||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
Quote:
![]() Quote:
|
||||
|
|
|
|
|
#19 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() 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);
}
|
|
|
|
|
|
|
#20 |
|
Bannato
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
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:22.





















