View Full Version : [java]switch
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
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
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
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...
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.
Un O(N^2) per uno switch è più lascivo che liscio.
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:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.