PDA

View Full Version : [Java-Jade]Confronto di stringhe fra due Liste


ermasto
22-04-2011, 11:35
Ciao a tutti sto realizzando un'applicazione che bilancia un carico in un cluster e mi trovo in difficoltà nel confronto fra due liste.
La prima lista contiene tutti gli agenti di un container e puo essere di un ordine variabile da 1 a 10 agenti, la seconda invece contiene una lista degli agenti che possono essere bilanciati all'interno della mia architettura.

La mia applicazione funziona cosi: una volta conosciuto chi è il container con piu risorse Cpu vado a vedere chi sono gli agenti che si trovano all'interno, se ci sono agenti che possono essere spostati,uno alla volta vengono spostati in altri container.

La mia difficoltà sta proprio nel confrontare queste 2 liste perche non so a priori il numero di agenti che ci sono in un container ne quelli che possono essere spostati in tutta la mia piattaforma e allora ho provato con il ciclo for e a volte funziona e a volte no.

Ecco il codice(sicuramente incorretto):
for(int i=0;i<ListaAgentiContCarico.size();i++){
Iterator it= ServerCar.iterator();
while (it.hasNext()){
if (ListaAgentiContCarico.get(i).toString().contains(it.next().toString())){
VettListaAgentiContCarico.add(ListaAgentiContCarico.get(i));
}
}
}


Dove ListaAgenti... contiene la lista di tutti gli agenti del container e
ServerCar contiene la lista di tutti gli agenti che possono essere spostati
Infine VettListaAgentiContCarico dovrebbe contenere dopo fatto il confronto la lista degli agenti che si trovano in quel container e che possono essere spostati.

Come posso gestire questa situazione?
Grazie mille

banryu79
22-04-2011, 12:04
Non conosco Jade, quindi non so come un agente venga univocamente identificato, però mi sembra chiaro che al posto di memorizzare gli agenti "che possono essere spostati" (chiamiamoli 'riassegnabili') in una lista come fai adesso sarebbe invece sufficiente memorizzare solo gli ID degli agenti; ad esempio in un HashSet, tipo:

Set<AgenteID> idAgentiRiassegnabili = new HashSet<AgenteID>();
// popola il set con gli id riassegnabili...


A quel punto avendo la lista degli agenti del container da una parte, e il tuo hashset con gli ID degli agenti "riassegnabili" dall'altra, si potrebbe dire una cosa tipo:

List<Agente> agentiDaRiassegnare = new ArrayList<Agente>();

for (Agente agente : listaAgentiConCarico) {
if (idAgentiRiassegnabili.contains(agente.getID()))
agentiDaRiassegnare.add(agente);
}

return agentiDaRiassegnare;


Il tutto al netto di eventuali implicazioni in caso di accessi/mutazioni concorrenti da parte di più thread alle collezioni implicate.

ermasto
22-04-2011, 16:37
Ciao grazie per la risposta ma non sono riuscito ad utilizzarlo perché mi da un errore qua:

List<Agente> agentiDaRiassegnare = new ArrayList<Agente>();


all'interno del <> cosa dovrei mettere?

Grazie ancora

banryu79
22-04-2011, 17:28
all'interno del <> cosa dovrei mettere?

Immagino tu lo chieda perchè non conosci i Generics; comunque ci andrebbe il tipo delle istanze dei tuoi agenti.
Per capirci, immagina di voler creare una lista che contenga istanze di tipo String.
Senza i Generics diresti:

List listaDiString = new ArrayList();

solo che poi ci puoi infilare quello che ti pare (anche per sbaglio):

Object obj= new Object();
listaDiString.add(obj)

Se volevi solo String nella lista, a compile-time non te ne accorgi, ma a runtime sì, solo che è troppo tardi :D

// somewhere else in the code...
int index = 0;
String s = (String) listaDiString.get(index);
// Boom! ClassCastException...


Con i Generics invece diresti:

List<String> listaDiString = new ArrayList<String>();

Se poi provi a infilarci qualcosa di diverso da String, il compilatore ti da errore, lo sai subito e sai anche dove succede.
Inoltre non è neccessario il cast quando recuperi un elemento.

Ci sarebbe molto altro da dire sui Generics, ma ciò esula dal tuo problema.

ermasto
23-04-2011, 15:58
Ok grazie delle spiegazioni molto chiaro e esauriente,scusami se ti rispondo solo ora. L'ultima cosa che ti chiedo è:

nel ciclo for (Agente agente : ....) in agente cosa ci devo mettere?

Perche se ho capito bene in Set metto gli agenti che posso spostare, in listaagenticarico ho tutti i miei agenti della piattaforma e poi creo una nuova lista dove metto il confronto effettuato, l'unica cosa è il ciclo for che mi rimane incompreso.

Jade salva gli agenti in AID che è l'identificativo di un agente, in pratica NomeAgente@posizione:porta

Grazie ancora.

banryu79
25-04-2011, 11:27
Ciao, ripeto che non conosco Jade e il codice scritto era più per darti un'idea che altro.
Agente sarebbe il nome di un tipo che mi sono inventato che dovrebbe corrispondere a quello che in Jade e nel tuo software è il tipo di un agente.
Quando dico:

for (Agente agente : listaAgentiConCarico) {
if (idAgentiRiassegnabili.contains(agente.getID()))
agentiDaRiassegnare.add(agente);
}

voglio dire: prendi ogni agente che hai in 'listaAgentiConCarico' e se il suo ID (AID) corrisponde a uno di quelli nell'insieme degli 'agenti che possiamo riassegnare' aggiungilo alla lista degli agenti da riassegnare.

Come questo si traduca nel tuo software lo sai solo tu, e comunque era solo un'idea di massima :)

ermasto
28-04-2011, 16:29
Grazie infinitamente. Tutto funziona alla perfezione :D