PDA

View Full Version : [java]switch


yashi79
25-11-2007, 18:36
devo implementare uno switch su dei messaggi, il solo problema è che il campo sul quale lo devo fare è una stringa!
lo switch mi richiede un intero...
vi spiego: ho una coda di messaggi con un determinato comportamento, che può essere, ad es, CFP, REQUEST...
a seconda di questo comportamento ho i casi

if(msgS!=null){
performativaS =msgS.getPerformative();//ricavo qui l'oggetto su cui fare lo switch

switch (performativaS) {
case REQUEST:{}
ma REQUEST è una stringa....

ragazzi...sto editando per evidenziare il codice ma son fusa....

isAlreadyInUse
25-11-2007, 18:52
usa una serie di else if

yashi79
25-11-2007, 18:59
quindi devo rinunciare allo switch? :muro:

isAlreadyInUse
25-11-2007, 19:00
A meno che tu non cambi il tipo di messaggio, ma gari usi delle cosntanti

yashi79
25-11-2007, 19:10
hi hi hi
no sono messaggi std apartenenti ad una libreria predefinita...
grazie cmq!

altre opzioni?

isAlreadyInUse
25-11-2007, 19:27
.

mad_hhatter
25-11-2007, 20:12
potresti usare un dizionario per mappare le stringhe in numeri...

in ogni caso occhio con gli switch: vanno usati con attenzione se non vuoi che il codice diventi poco mantenibile... se i casi sono molti o se prevedi di doverli cambiare considera di mappare le stringhe in oggetti incaricati di gestire ciascuno un determinato messaggio

PGI-Bis
25-11-2007, 20:27
Mappa. Come chiavi usi i "tipi" dei messaggi e come valori un qualsiasi tipo di oggetto che corrisponda a ciò che devi fare in conseguenza di quel messaggio. In ipotesi:

class Messaggio
...public String getPerformativa()...

interface Azione
...void esegui(Messaggio m)

public class ActionChooser {
private HashMap<String, Azione> map = new HashMap<String, Azione>();

public ActionChooser(Map<String, Azione> choiceMap) {
map.putAll(choiceMap);
}

public void execute(Messaggio m) {
map.get(m.getTipo()).esegui(m);
}
}

Dopodichè non ti resta che creare le azioni, come scriveresti il codice dei "case" ma in forma di istanze di tipo Azione, es:

//REQUEST è un'ipotetica stringa
HashMap<String, Azione> dataMap = new HashMap<String, Azione>();
dataMap.put(REQUEST, new Azione() {
public void esegui(Messaggio m) {
System.out.println("REQUEST!!!");
}
});

rifilarle ad un ActionChooser:

ActionChooser chooser = new ActioChooser(dataMap);

e decidere cosa fare con:

actionChooser.execute(msgS);

wingman87
25-11-2007, 20:47
ragazzi...sto editando per evidenziare il codice ma son fusa....
Usi la slash sbagliata per chiudere il tag code.

Ti propongo un'altra soluzione:
metti i casi dentro ad un ArrayList e poi fai:

switch (tuoArrayList.indexOf(performativaS)) {
case tuoArrayList.indexOf(REQUEST):{}
case tuoArrayList.indexOf(CFP):{}
ecc...

yashi79
26-11-2007, 09:04
Usi la slash sbagliata per chiudere il tag code.

Ti propongo un'altra soluzione:
metti i casi dentro ad un ArrayList e poi fai:

switch (tuoArrayList.indexOf(performativaS)) {
case tuoArrayList.indexOf(REQUEST):{}
case tuoArrayList.indexOf(CFP):{}
ecc...


grazie gentilissimo...mi aspettavo proprio una soluzione "liscia" del genere.

PGI-Bis
27-11-2007, 19:38
Un O(N^2) per uno switch è più lascivo che liscio.

yashi79
28-11-2007, 00:10
Un O(N^2) per uno switch è più lascivo che liscio.
eh si la complessità è alta...
ma fortunatamente ho scoperto che il tipo del mio msg è un int!
quindi...grazie lo stesso a tutti, ma le stringhe sono già mappate!

isAlreadyInUse
28-11-2007, 08:26
Tutto sto casino per niente :asd: