Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] Bepaalde string accepteren

Pagina: 1
Acties:

  • Nilltris
  • Registratie: Mei 2011
  • Laatst online: 14-06-2023
Hallo Allemaal,

Ten eerste excuses als ik hier verkeerd zit, of onduidelijk ben. Het is mijn eerste keer :$

Ik ben mezelf een beetje aan het leren programmeren in Java, en nu zit ik met het volgende:

Ik wil dat wanneer een variabele een bepaalde waarde heeft, alleen een bepaalde string wordt geaccepteerd.
Dus zeg variabele 'counter' = 1. Dan wordt alleen de string "back" geaccepteerd. Bij elke andere string die wordt ingevoerd krijgt de gebruiker de melding "je kunt alleen terug (back)" of iets dergelijks.

Ik heb natuurlijk zelf al wat geprobeerd.
Nu weet ik eerlijk gezegd niet hoe ik code op het forum kan plaatsen. Maar ik zal het proberen:
(indentation heb ik ook nog helemaal niet onder de knie, excuses ervoor)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Start (test 1)   
  outputmain.setText("Hallo enzovoort (1 of 2)"); //dit is waar de tekst tevoorschijn komt
  butt1.addActionListener(new ActionListener() { //listener voor butt1
  int counter = 0; //variabele counter begint op 0
 @Override
 public void actionPerformed(ActionEvent e) //wanneer butt1 wordt gebruikt
 { 
    String text = field1.getText();  //vul de string 'text' met input
       if(text.equals("1")) //als de gebruiker 1 kiest
       {
            counter = 1; //set counter op 1 //wordt de counter op 1 gezet
            outputmain.setText("Je hebt optie 1 gekozen, je kunt alleen terug (back)");
               while(counter == 1) { //zolang de counter op 1 staat
                  if(text.equals("back")){ //als de string 'back' is
                     counter = 0; //zet de counter op 0
                     outputmain.setText("je hebt back gekozen! goedzo"); }
                  else { //anders
                     outputmain.setText("Je mag alleen terug (back)");  } //je mag alleen terug
               }
       }  
       else if(text.equals("2")) //als 2 wordt gekozen
       { 
           counter = 2; //zet de counter op 2    
           outputmain.setText("Je hebt optie 2 gekozen");
        }    
 }
});
//End (test 1)


Ik hoop dat de code een beetje duidelijk is, maar waar het op neer komt is dat als er '1' wordt 'gekozen' de counter op 1 wordt gezet. En als er '2' wordt gekozen de counter op 2 staat.
Nu wil ik dat zolang de counter op 1 staat, alleen de string "back" geaccepteerd wordt.
Als ik deze code draai, stopt Java met reageren zodra ik '1' kies (dus zodra de counter op 1 wordt gezet).
Ik denk dat dit te maken heeft met het while(counter == 1) gedeelte.

En nu dan eindelijk mijn vraag:
Heeft iemand een idee hoe ik dit het beste kan aanpakken? Bijvoorbeeld een andere manier wat hier beter voor werkt?

  • Voyage
  • Registratie: December 2002
  • Laatst online: 16:16
Waarom een while en geen if-statement? Weet je zeker de variabele text de waarde 'back' heeft zonder enige spaties en/of hoofdletters? Je kunt eventueel ook de methode equalsIgnoreCase gebruiken in combinatie met de trim methode op de variebele 'text'.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Waarom in hemelsnaam die while loop? Je programma reageert niet omdat je in een bepaalde situatie in een oneindige loop terecht komt. Er is ook geen enkele reden een loop te gebruiken.

Als ik jou was zou ik het uitlezen van de controls en het daarop acteren even scheiden, dit heb je nu in je code 'gemengd'. Gewoon een paar 'if' statements is dus genoeg.

https://niels.nu


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22-11 13:46

Janoz

Moderator Devschuur®

!litemod

Je interpreteerd 'while' verkeert. Een 'while' is een lusje.

Java:
1
2
3
while ( expressie ) { 
  code
}

Zolang 'expressie' waar is moet je 'code' herhalen. Zet maar eens een System.out.println(text) in de code of stap met de debugger door de code. Dan zul je zien dat hij constant de tekst op het output.main aan het aanpassen is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Voyage
  • Registratie: December 2002
  • Laatst online: 16:16
Janoz schreef op dinsdag 02 juli 2013 @ 11:00:
Je interpreteerd 'while' verkeert. Een 'while' is een lusje.

Java:
1
2
3
while ( expressie ) { 
  code
}

Zolang 'expressie' waar is moet je 'code' herhalen. Zet maar eens een System.out.println(text) in de code of stap met de debugger door de code. Dan zul je zien dat hij constant de tekst op het output.main aan het aanpassen is.
Niet als zijn counter op 0 wordt gezet.

Vandaar dat ik aangaf om een trimi en equalsIgnoreCase op zijn variabele toe te passen. Uiteraard moet die while een if worden.

  • ocwil
  • Registratie: Mei 2007
  • Laatst online: 20-11 14:52
het probleem is dat hij eerst checked op text.equals("1") en daarna diezeflde text controleerd op "back"

daartussen in gaat de variable text nooit veranderen.

~ Portal 2 maps: linkje ~ LoL (EUW): Ocwil ~


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22-11 13:46

Janoz

Moderator Devschuur®

!litemod

'tekst' wordt nergens in de while lus aangepast

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Voyage
  • Registratie: December 2002
  • Laatst online: 16:16
Inderdaad!

  • Nilltris
  • Registratie: Mei 2011
  • Laatst online: 14-06-2023
Bedankt voor het meedenken en de (snelle) reacties!
Ik had het eerst op de volgende methode gedaan (let even niet op de indentation):

Java:
1
2
3
4
5
6
7
8
9
10
11
12
if(text.equals("1")) //als 1 wordt gekozen
                            {
                        outputmain.setText("Je hebt optie 1 gekozen, je kunt alleen terug (back)");
                        }
                        else if(text.equals("2")){
                        outputmain.setText("Je hebt optie 2 gekozen");
                            }
                        else if(text.equals("back")){
                        outputmain.setText("Je hebt back gekozen, goedzo");
                            }  
                        }
                        });

Dat 'werkt'. Alleen kun je wanneer je 1 gekozen hebt, gewoon weer 2 kiezen (er wordt nergens een restrictie opgelegd). Dat is wat ik wil voorkomen ( naar mijn idee door middel van de counter).

Zoals ik het begrijp zou de while loop dus kunnen werken, zolang de counter maar weer op 0 (of een andere waarde) gezet kan worden. Echter kan ik niets meer zodra de counter op 1 gezet wordt. Is er een betere manier dan de while loop om te bereiken wat ik wil?
(ik zit nu te denken aan bijvoorbeeld nog een variabele die vanzelf optelt zodra de counter op 1 gezet wordt, en als die op bijvoorbeeld 10 komt de counter zelf terug zet naar een andere waarde. Maar volgens mij is dat veels te omslachtig voor wat ik probeer te doen...)

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22-11 18:42

Rannasha

Does not compute.

Probeer het zo eens:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 public void actionPerformed(ActionEvent e) //wanneer butt1 wordt gebruikt
 { 
    String text = field1.getText();  //vul de string 'text' met input
       if (counter == 1)
       {
               if (text.equals("back"))
               {
                       counter = 0; //zet de counter op 0
                       outputmain.setText("je hebt back gekozen! goedzo"); 
                }
                else 
                {
                       outputmain.setText("Je mag alleen terug (back)");  } //je mag alleen terug
                }
       }  
       else if(text.equals("1")) //als de gebruiker 1 kiest
       {
            counter = 1; //set counter op 1 //wordt de counter op 1 gezet
            outputmain.setText("Je hebt optie 1 gekozen, je kunt alleen terug (back)");
       }
       else if(text.equals("2")) //als 2 wordt gekozen
       { 
           counter = 2; //zet de counter op 2    
           outputmain.setText("Je hebt optie 2 gekozen");
        }    
}


Eerst wordt gekeken of de counter op 1 staat. Zo ja, dan mag alleen "back" worden ingevoerd. Staat de counter niet op 1, dan wordt deze op 1 of 2 gezet als dit ingevoerd is.

|| Vierkant voor Wiskunde ||


  • Nilltris
  • Registratie: Mei 2011
  • Laatst online: 14-06-2023
Rannasha schreef op dinsdag 02 juli 2013 @ 11:19:
Probeer het zo eens:

Java:
1
code


Eerst wordt gekeken of de counter op 1 staat. Zo ja, dan mag alleen "back" worden ingevoerd. Staat de counter niet op 1, dan wordt deze op 1 of 2 gezet als dit ingevoerd is.
Top! Dit is hoe ik dus moet leren denken. Ik was veels te moeilijk bezig |:( .
Eerst de regels vertellen, en daarna pas de optie geven dus.
Hartstikke bedankt! (allemaal)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22-11 13:46

Janoz

Moderator Devschuur®

!litemod

Het is trouwens geen counter, maar meer een status. Zorg dat je begrijpt wat een variabele inhoud wanneer je zijn naam ziet.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Voyage
  • Registratie: December 2002
  • Laatst online: 16:16
Janoz schreef op dinsdag 02 juli 2013 @ 11:41:
Het is trouwens geen counter, maar meer een status. Zorg dat je begrijpt wat een variabele inhoud wanneer je zijn naam ziet.
Als je hierop zou voortborduren zou je je waarden van je counter kunnen defineren als variabelen.

Java:
1
2
public static final int STATUS_EEN = 1;
public static final int STATUS_TWEE = 2;


Uiteraard moet STATUS_EEN en STATUS_TWEE een duidelijke naam hebben waardoor je doorhebt waar het over gaat :P .

Maakt het wat leesbaarder :).

[ Voor 11% gewijzigd door Voyage op 02-07-2013 11:46 ]


  • Nilltris
  • Registratie: Mei 2011
  • Laatst online: 14-06-2023
Ik heb het maar even counter genoemd, maar status is inderdaad beter.
Bedankt voor alle tips, des te meer des te beter ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Voyage schreef op dinsdag 02 juli 2013 @ 11:45:
[...]


Als je hierop zou voortborduren zou je je waarden van je counter kunnen defineren als variabelen.

Java:
1
2
public static final int STATUS_EEN = 1;
public static final int STATUS_TWEE = 2;


Maakt het wat leesbaarder :).
Dat is wel één van de slechtste voorbeelden die je kunt geven. De intentie is goed, het voorbeeld slaat faliekant de plak mis ;) Je leert TS nu dit te doen:

Java:
1
2
3
public static final int ONE = 1;
public static final int TWO = 2;
public static final int THREE = 3;

terwijl, wat jij probeert aan te geven is:
Java:
1
2
3
public static final int DAYS_IN_WEEK = 7;
public static final double PI = 3.141592653589793;
public static final int MAX_ITEMS_PER_ORDER = 999;
Voyage schreef op dinsdag 02 juli 2013 @ 11:45:
Uiteraard moet STATUS_EEN en STATUS_TWEE een duidelijke naam hebben waardoor je doorhebt waar het over gaat :P .
Snel editten als ik aan 't typen ben hé :P

[ Voor 16% gewijzigd door RobIII op 02-07-2013 11:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Voyage
  • Registratie: December 2002
  • Laatst online: 16:16
RobIII schreef op dinsdag 02 juli 2013 @ 11:47:
[...]

Dat is wel één van de slechtste voorbeelden die je kunt geven. De intentie is goed, het voorbeeld slaat faliekant de plak mis ;) Je leert TS nu dit te doen:

Java:
1
2
3
public static final int ONE = 1;
public static final int TWO = 2;
public static final int THREE = 3;

terwijl, wat jij probeert aan te geven is:
Java:
1
2
3
public static final int DAYS_IN_WEEK = 7;
public static final double PI = 3.141592653589793;
public static final int MAX_ITEMS_PER_ORDER = 999;


[...]

Snel editten als ik aan 't typen ben hé :P
Ik had het inderdaad geedit. Ik had het niet duidelijk genoeg gemaakt dat de naam van de variabele beteknisvol moest zijn. Ik probeer inderaad aan te geven wat jij neergezet hebt :o .

  • Nilltris
  • Registratie: Mei 2011
  • Laatst online: 14-06-2023
Wat dit uiteindelijk moet worden is een soort van simpele mini tekst "spel" gebaseerd op keuzes.
Zo krijg je bijvoorbeeld nadat je een keuze hebt gemaakt weer nieuwe keuzes (bijvoorbeeld je komt in een kamer de volgende keuzes zijn beschikbaar (inspecteer, terug, gebruik) en daar weer nieuwe opties door)).
Misschien ook wel leuk als ik laat zien wat ik tot nu toe heb? ik weet niet of het is toegestaan in dit topic? (misschien ga ik nu teveel offtopic, als dat zo is laat het weten dan verwijder ik deze post).

Afbeeldingslocatie: http://i.imgur.com/omvc8QZ.png

Het is voor mij de allereerste keer dat ik probeer te programmeren. Het ziet er wellicht niet uit, maar ik vind het heel leuk om te kijken hoe ver ik hiermee kan komen (tot noch toe zelf studie en hulp van internet).

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Nilltris schreef op dinsdag 02 juli 2013 @ 11:17:
Zoals ik het begrijp zou de while loop dus kunnen werken, zolang de counter maar weer op 0 (of een andere waarde) gezet kan worden. Echter kan ik niets meer zodra de counter op 1 gezet wordt. Is er een betere manier dan de while loop om te bereiken wat ik wil?
Ik zie nu net je volgende post met uitleg wat je precies probeert te doen. Ik denk dat je misschien wat hard van stapel loopt (je weet nog niet wanneer je een IF moet toepassen en wanneer een while). Maargoed.

Wat je moet gaan inrichten is een model dat de 'state' van je systeem of spelwereld bijhoudt. Een dergelijk object beschrijft voor elke state (counter = 1) welke overgangen mogelijk zijn. Normaal lees je dat uit een bestand in (maar dat is nog ff iets te vergezocht vermoed ik) dus dat opbouwen kan in wel ff in de code. Maar dan nog wil je hoe dan ook je user inferface scheiden van je model (ook wel het model-view-controller model genoemd, google maar als je er meer van wil weten maar ik vermoed dat dat ook nu wat te geavanceerd is).

Anyway, je kunt simpelweg beginnen met een paar lijstjes. Stel je hebt 4 kamers waar je tussendoor kunt stappen, maar niet elke kamer heeft een verbinding met een andere kamer. Dus:
Kamer 1:
- verbinding naar kamer 2 en 4

Kamer 2:
- verbinding naar kamer 1 en 3

etc.

Probeer dit om te zetten in een paar klasses. Je hebt een objecttype 'Room' (kamer) nodig, en een objecttype 'Passage' (doorgang). Een kamer heeft een lijst doorgangen naar andere kamers. Een doorgang heeft een "naam" of "richting", bijvoorbeeld "east" of "up".

Je houdt dus in je wereld bij wat de huidige kamer is. Als iemand "east" typt loop je door de aanwezige doorgangen in je kamer en kijkt of er een doorgang "east" is. Zo ja, dan neem je die doorgang, maakt die kamer je huidige kamer, en wacht weer op een opdracht.

Als die kamer geen doorgang genaamd "east" heeft, dan geef je een foutmelding.

Zoals ik al zei: je geeft jezelf nogal een flinke opdracht in dit stadium van je leerproces. Ik denk dat je eerst even moet beginnen alle language constructs e.d. goed te snappen en te begrijpen hoe OO programmeren, lijsten, arrays e.d. werken voordat je een spelletje begint te maken.

https://niels.nu


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
RobIII schreef op dinsdag 02 juli 2013 @ 11:47:
[...]

Dat is wel één van de slechtste voorbeelden die je kunt geven. De intentie is goed, het voorbeeld slaat faliekant de plak mis ;) Je leert TS nu dit te doen:

Java:
1
2
3
public static final int ONE = 1;
public static final int TWO = 2;
public static final int THREE = 3;
Dat is toch ook een perfecte manier om automatische code_review methodes niet te laten vallen over magic numbers ;)
En die reden heb ik ooit eens serieus van een programmeur gehoord die niet een al te lange werkperiode bij dat bedrijf beschoren was
Pagina: 1