Archief - [JAVA] Spatie in split

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Bumbolt

Legacy Member
PHP:
/*
* Deze methode voert de bewerking uit
*/

    public void berekenResultaat() {

        splitInput = new String[500];
        splitInput = input.split("\\s");

        System.out.println(splitInput[0]);
        System.out.println(splitInput[1]);

    }

Deze staan in de velden :

Code:
String[] splitInput;
String input;


Het probleem is dat hij slechts op 1 spatie splitst. splitInput[0] is gevuld maar splitInput[1] niet.

Bv. voor input "12 + 12"

Krijg ik output: 12 en een Index out of bounds. Maw splitInput[1] is null

Ik heb de space al op verschillende manieren gedefinieerd (" ", ' ' (werkt logisch niet),...)

Als ik split("1") gebruik krijg ik voor input "23145" wel mooi "23" en "45".

Heeft iemand een idee hoe ik spatie goed definieer?

forloRn_

Legacy Member
Ben je toevallig command-line parameters aan het parsen? Als daar spaties in staan, dan gaat hij de parameters logischerwijs in args[0], args[1], args[2], ... zetten. Splitten van args[0] geeft je dan een array van 1 element ("12");

Waarom instantieer je daar trouwens een array van 500 Strings? String.split() geeft je sowieso een nieuwe array terug.

Bumbolt

Legacy Member
forloRn_ zei:
Waarom instantieer je daar trouwens een array van 500 Strings? String.split() geeft je sowieso een nieuwe array terug.

Ok dat wist ik niet. Ik zou het later aanpassen naar lengte van input.

Ik het eerste stuk volg ik niet.

forloRn_

Legacy Member
De String input, waar komt die vandaan? Zet je die letterlijk in je source code ("12 + 12") of is dat iets dat je meegeeft bij het starten van het programma?

Plak anders de volledige code hier eens, we zijn tenslotte niet helderziend.

Bumbolt

Legacy Member
forloRn_ zei:
De String input, waar komt die vandaan? Zet je die letterlijk in je source code ("12 + 12") of is dat iets dat je meegeeft bij het starten van het programma?

Plak anders de volledige code hier eens, we zijn tenslotte niet helderziend.

Die komt uit user input de klasse Input.readString();


Hier Calculator.java

PHP:
/*
*
* @date: 16-03-2011
* @author: Reinout Claeys
*/

public class Calculator {

 /*
* Velden definieren.
*/

String input;

int result;

String[] splitInput;

/*
* Deze methode is de main methode
*/

    public static void main (String args[]) {

        Calculator rekenmachine = new Calculator();

       // Toon startinformatie en prompt.

        rekenmachine.toonStartInfo();
        rekenmachine.start();

       // Wacht op invoer en controleer invoer.

        rekenmachine.behandelIngave();



    }


/*
* Deze methode geeft de algemene info over het programma mee.
*/

    public void toonStartInfo() {

        System.out.println("Welkom bij de Console Calculator");
        System.out.println("Een realisatie van R. Claeys");
        System.out.println("Geef 'help' voor meer informatie omtrent het gebruik");
        System.out.println();

    }

/*
* Deze methode geeft de algemene info over het gebruik van het programma.
*/

    public void toonHelpInfo() {

        System.out.println("tracehelp");

    }

/*
* Deze methode omvat repetitieve verwerking van ingave van de gebruiker
*/

    public void start() {

        System.out.print("calc> ");

       // wacht terug op invoer van gebruiker. (repititief)
        behandelIngave();

    }

/*
* Deze methode leest en interpreteert de ingave (rekenkundige expressie, stop of help commando)
*/

    public void behandelIngave() {

        input = Input.readString();

        if (input.equals("stop") || input.equals("STOP")) {

             System.exit(0);

        }
        else if (input.equals("help") || input.equals("HELP")) {

           // toon help info, spring terug naar prompt en wacht op invoer van gebruiker

            toonHelpInfo();
            start();

        }
        else {

                berekenResultaat();
                start();

        }

     }

/*
* Deze methode voert de bewerking uit
*/

    public void berekenResultaat() {

        splitInput = input.split("\\s");

        System.out.println(splitInput[0]);
        System.out.println(splitInput[1]);
        System.out.println(splitInput[2]);


    }

}

EDIT: De mehtode werkt inderdaar als ik bv.
input = "23 21 12"; plaats in begin van de methode.

Hoe kan ik dit dan oplossen?

MilM

Legacy Member
1)
Zeker dat die Input.readString() werkt?
Ik ken die klasse niet. Is dat een eigen klasse?

Als ik die regel vervang door het volgende heb ik namelijk geen enkel probleem met de output.

Code:
        InputStreamReader inputR = new InputStreamReader(System.in);
    	BufferedReader reader = new BufferedReader(inputR);
    	try
    	{
    	    input = reader.readLine(); 
    	}
    	catch(Exception e){}

2)

Op het einde een for lus aanspreken voor de output
for (int x=0; x<splitInput.length; x++)
System.out.println(splitInput[x]);

3)

input.equals("stop") || input.equals("STOP")

vervang je beter door

input.toLowerCase().equals("stop")

Idem voor Help. Korter, en wanneer je Stop of Help intypt zal het ook werken (in uw geval niet)

4)

Opletten met waar je variabelen aanmaakt.

Het heeft meer zin om bijvoorbeeld de input mee te geven aan de methode berekenResultaat, dan om deze bovenaan aan te maken.
Wanneer je deze variabele namelijk als parameter meegeeft, kan uw methode gebruikt worden voor meerdere parameters, terwijl je in uw voorbeeld je altijd verplicht bent om het in de variabele input te steken.

splitInput moet je bovenaan ook niet aanmaken. Doe dat gewoon in de berekenResultaat methode zelf.

Zoveel mogelijk variabelen aanmaken waar ze gebruikt worden en niet bovenaan je klasse.

Arboris

Legacy Member
3)

input.equals("stop") || input.equals("STOP")

vervang je beter door

input.toLowerCase().equals("stop")

Idem voor Help. Korter, en wanneer je Stop of Help intypt zal het ook werken (in uw geval niet)

Ikzelf zou het zo schrijven:

"stop".equalsIgnoreCase(input);

-> NullPointerProof omdat constante eerst staat (in dit geval misschien niet nodig, maar is een goeie gewoonte)

Om helemaal zeker te zijn zou je de input string ook nog kunnen trimmen, waardoor extra spaties worden verwijderd.

For loop kan ook handiger (imho, en er zijn uitzonderingen):
for(String str : splitInput) {
System.out.println(str);
}

Bumbolt

Legacy Member
Het is een project voor school. De klasse Input is door leerkracht meegegeven. (en al voor andere oefeningen succesvol gebruikt) die werkt dus.

De klasse zelf werkt met scanners. En zoals ik al zei werkt het met "1" wel dus dat wijst er op dat die methode werkt en het enkel aan de " " ligt, of heb ik het daar verkeerd?

Ik weet hoe ik een parameter moet meegeven aan methodes. (Het eerst unief Informatica gevolgd en nu naar hogeschool haal ik het vak in.) Maar ik ken het zogezegt nog niet.

De opdracht is om een kleine rekenmachine te maken. Maar ik loop vast op het opsplitsen daarom zette ik het hier even neer.

Verder, bedankt voor de tip met toLowerCase. Daar had ik zelf niet aan gedacht.

Ik weet echter nog steeds niet hoe ik het moet oplossen en ik kan het niet opzoeken aangezien ik niet goed snap wat er precies fout loopt. Wordt input dan gewijzigd tussendoor?

die System.out.print op einde is niet definitief. Ik wou gewoon snel enkele waarden testen. Daarom geen loopje. Maar inderdaad een handigere/betere check als je niet lui bent xD

Extra spaties kan ik ook door men regex als \\s+ te definieren. Maar wou eerst een simpele versie maken aangezien de \\s nog niet werkt.

Ik heb de variable input al veranderd door ingave (dacht dat var input misschien in tussentijd werd aangepast.) maar maakt geen verschil. Eerst (0) element vn array wordt gevult en derest blijft leeg. Ik vind het heel raar.

MilM

Legacy Member
Trimmen is inderdaad een goed idee.
NullPointerproof weet ik niet of je als een voordeel of nadeel moet beschouwen.
Het kan eventueel het debuggen vergemakkelijken.

En persoonlijk vind ik die for lus minder leesbaar, zeker voor beginners. Maar dat zijn allemaal voorkeuren natuurlijk.

Bumbolt

Legacy Member
Ik heb de oplossing gevonden. readString leest idderdaad enkel een woord. Wel een foute naam imo. Ik heb in Input ook een readLine() gevonden, deze leest een voledige string.

Dom van mij om niet Input te checken.

Bedankt voor jullie hulp.

8BitBoy

Legacy Member
ICT aan Kahosl? Wist niet dat ze ook Java basisconcepten gaven in tweede semester? Als je vragen hebt hebben we ook ons forum ICT-blue.be. Ze zullen je daar met plezier helpen.
Grtz.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan