Avatar billede martinbk Nybegynder
13. september 2003 - 18:00 Der er 6 kommentarer og
2 løsninger

optimering ændring af kontrolstruktur

hejsa igen E, jeg har siddet og leget lidt med en IRC bot skrevet fra bunden med java, og er da også kommet ganske langt, nu er mit problem blot at jeg synes denne struktur er en anelse uhænsigtsmæssig og vil derfor hører om der ikke er en smartere måde at gøre følgende på:

String[] res;
      while(true) {
        res = forb.readResponse();
        if(res[1].equals("PING")) {
          forb.send("PONG "+res[2]);
        }
        elseif(res[1].equals("001")) {
          forb.send("JOIN #channel");
        }
      }
altså min res[1] indeholder forskellige værdier og derefter skal mit program så udfører forskellige handlinger, men synes if elseif struktureren er lidt tung når man har 50 elseif'er.. håber der er nogen som har en smart løsning.

på forhånd tak
Martin
Avatar billede arne_v Ekspert
13. september 2003 - 18:03 #1
Desværre tror jeg ikke der er meget at gøre.

Du kan ikke lave en switch på en String i java, så du er næsten nødt til at bruge
if elseif elseif ...!
Avatar billede arne_v Ekspert
13. september 2003 - 18:04 #2
Det vil nok være pænt at kune have et enkelt metode kald inden i
alle {}'erne d.v.s. hvis der skal udføres flere linier, så encapsulate
i en metode.
Avatar billede arne_v Ekspert
13. september 2003 - 18:06 #3
Det er teknisk muligt at undgå if elseif elseif ...:

* lav en klasse for hver
* lad alle klasse implementere samme interface med en process metode
* gem et objekt af hver klasse i en hashmap under test værdien
* hent interface ud af hashmappen udfra test værdi og kald process metoden

Men jeg synes ikke at det er en kønnere metode.
Avatar billede _carsten Nybegynder
13. september 2003 - 20:15 #4
Kan du ikke lave et 2 dimensionelt array, indeholdene værdien der skal
checkes og værdien der skal sendes, det array holder du op imod 'res'

Da det er tekststrenge du checker, burde det ikke være noget problem
og slipper for dine if else if'er

Noget a la nedenstående (Ved det ikke, bare et forslag):

public class Test {
    public Test() {
        String[] res = {"PING", "DYNAMO"};
        String[][] check = {{"PING", "# ping"},
                          {"PONG", "# pong"},
                          {"DYNAMO", "# dynamo"}};
                         
        for(int i = 0; i < res.length; i++)
            for(int x = 0; x < check.length; x++)
                if( res[i].equals(check[x][0]))
                    System.out.println(check[x][1]);
    }

    public static void main(String[] args) {
        new Test();
    }
}
Avatar billede conrad Nybegynder
13. september 2003 - 23:10 #5
Hvis du virkelig gerne vil undgå if elese kan du evt bruge Strings hashCode() og beregne værdier for alle strenge under initialisering:
int PING = "ping".hashCode();
int PONG = "pong".hashCode();

Derefter kan du under selve programafviklingen lave din switch
swicth(res[1].hashCode())
{
case PING:doPing();break;
case PONG:doPong();break;
}
Jeg tvivler dog på det er hurtigere + der er ikke nogen garanti for at
string1 != string2 => string1.hashCode() != string2.hashCode() jvf dokumentationen. Så det skulle lige testes først
Avatar billede martinbk Nybegynder
19. september 2003 - 23:46 #6
da både arne og conrad gav brugbare løsninger, beder jeg lige arne smide et svar, så må i dele lidt points :)
Avatar billede arne_v Ekspert
19. september 2003 - 23:48 #7
svar
Avatar billede arne_v Ekspert
27. september 2003 - 13:39 #8
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester