Splitta sträng i Java, varför blir det på detta viset?

Permalänk
Medlem

Splitta sträng i Java, varför blir det på detta viset?

Hej!
Håller på med ett Java-program som använder sig av en Jlist för att läsa in namn och anställningsnummer från en databas. Det går bra, och resultatet syns i listan som 1. Förnamn Efternamn. Jag vill sedan plocka ut anställningsnumret för att använda det i en ny sökning i databasen, och försöker då använda split. Min metod ser ut som följer:

public void visaPersonalInfo(){ String information = jliPersonal.getSelectedValue() + ""; String[] namnOchAid; namnOchAid = information.split(".",2); for(int i = 0; i<namnOchAid.length; i++) { System.out.println(namnOchAid[i]); } }

Jag tycker resultatet borde bli:

1 . Förnamn Efternamn

Men där siffran borde stå finns ingenting. Vad kan detta bero på?

Permalänk
Medlem

Split tar emot Regex som argument så antar att du är ute efter

split("\\.",2)

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Sen ett tips för ett enklare "liv", använd Javas Tokenizer om du inte är van med regex lättare med delimiters där

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Enligt dokumentationen är en punkt bara en punkt i Java, så \\ ska inte behövas.
Och den delar ju strängen på rätt ställe, fast den verkar kasta bort första delen. =/

Permalänk
Medlem
Skrivet av Amöban:

Enligt dokumentationen är en punkt bara en punkt i Java, så \\ ska inte behövas.
Och den delar ju strängen på rätt ställe, fast den verkar kasta bort första delen. =/

split tar emot regex, det står i dokumentationen. I regex är . en wildcard char, dvs den kan representera vilket tecken som helst. Du ska skriva information.split("\\.",2);

Permalänk
Medlem

Åååh... Hade läst helt fel i dokumentationen såg jag nu. Klantigt!
Tack för hjälpen och god jul!

Permalänk
Medlem

Varför appendar du en tom sträng till getSelectedValue() ? Antar att getSelectedValue() returnerar ett Object och detta är ett försök till casting?

I så fall är det bättre att casta returvärdet explicit:

String information = (String)jliPersonal.getSelectedValue();

Om inte annat blir mer läsligt.

Visa signatur

"The devil will find work for idle hands to do."

Permalänk
Medlem
Skrivet av Nutshell:

Varför appendar du en tom sträng till getSelectedValue() ? Antar att getSelectedValue() returnerar ett Object och detta är ett försök till casting?

I så fall är det bättre att casta returvärdet explicit:

String information = (String)jliPersonal.getSelectedValue();

Om inte annat blir mer läsligt.

Aha, tack för tipset! Tänkte väl egentligen att jag inte behövde göra nån omvandling alls, en sträng är väl ett objekt av klassen String?

Permalänk
Medlem
Skrivet av Amöban:

Aha, tack för tipset! Tänkte väl egentligen att jag inte behövde göra nån omvandling alls, en sträng är väl ett objekt av klassen String?

Som sagt, jag vet inte vad jliPersonal.getSelectedValue() har för returtyp. Returnerar den String så behövs ingen omvandling alls, och ja, en sträng är ett objekt av klassen String.

Blev bara lite förvirrad av att du hade + ""; med.

Och när jag sa Object så menade jag Java-klassen, inte en instans av en klass.
objekt = instans av en klass i ett objektorienterat språk
Object = rotklassen i java. Alla klasser i Java ärver från denna klassen.

Men det känns som att jag rör till det för dig. Stryk + "" så är jag nöjd.

Visa signatur

"The devil will find work for idle hands to do."

Permalänk
Medlem
Skrivet av Nutshell:

Som sagt, jag vet inte vad jliPersonal.getSelectedValue() har för returtyp. Returnerar den String så behövs ingen omvandling alls, och ja, en sträng är ett objekt av klassen String.

Blev bara lite förvirrad av att du hade + ""; med.

Och när jag sa Object så menade jag Java-klassen, inte en instans av en klass.
objekt = instans av en klass i ett objektorienterat språk
Object = rotklassen i java. Alla klasser i Java ärver från denna klassen.

Men det känns som att jag rör till det för dig. Stryk + "" så är jag nöjd.

Ok, nu lärde jag mig nåt nytt. Returtypen var Object, tänkte inte på att det var rotklassen som menades. Ska göra en explicit omvandling.

Permalänk
Medlem
Skrivet av Nutshell:

Varför appendar du en tom sträng till getSelectedValue() ? Antar att getSelectedValue() returnerar ett Object och detta är ett försök till casting?

I så fall är det bättre att casta returvärdet explicit:

String information = (String)jliPersonal.getSelectedValue();

Om inte annat blir mer läsligt.

I detta läge kan det vara bättre att skapa en ny sträng (vilket är vad ""+ gör). Alla objekt har en toString-metod som anropas implicit, men alla objekt är inte String-objekt. Genom att appenda en tom sträng garanteras att man aldrig får ett exception.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

I detta läge kan det vara bättre att skapa en ny sträng (vilket är vad ""+ gör). Alla objekt har en toString-metod som anropas implicit, men alla objekt är inte String-objekt. Genom att appenda en tom sträng garanteras att man aldrig får ett exception.

Skickades från m.sweclockers.com

Vilken typ av exception syftar du på? Den enda jag kan komma på som man undviker om man gör så är NullPointerException, och är det sådana man är rädd för bör man väl göra en nullcheck istället, annars kommer man ju bara utföra efterkommande operationer på strängen "null".

I båda fallen (cast till String vs. appenda tom sträng) så kommer toString() att anropas på objektet, enda skillnaden är att vid cast kommer vi få null om det vi försöker omvandla är null, och i det andra fallet kommer vi få null representerat som sträng + en tom sträng. Och då är det första alternativet + nullcheck och felmeddelande om resultatet är null bättre, än att fortsätta och använda strängen "null" för efterkommande operationer.

class Main { public static void main (String[] args) throws java.lang.Exception { String correctWay = (String)getSelectedValue(); String wrongWay = getSelectedValue() + ""; System.out.println(correctWay == null); System.out.println(wrongWay == null); } public static Object getSelectedValue() { return null; } }

Resultat:

true false

Visa signatur

"The devil will find work for idle hands to do."

Permalänk
Medlem

Som Teknocide sa, i vissa fall. Jag håller med om att ha "null safe" kod är bättre men sen så är det ju fall där det kanske inte spelar så stor roll och det ligger mer "värde" i att veta att man inte får exception samt inte behöver skriva extra hantering. Beror helt på situation och vad som är praktiskt. Dilemmat med hur mkt felhantering man skall ha är ju inte ovanligt så :P. Bra att veta och säkert lärorikt för TS iaf!:)
Enda julaftonsinlägget, god jul på er!

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av Nutshell:

Vilken typ av exception syftar du på? Den enda jag kan komma på som man undviker om man gör så är NullPointerException, och är det sådana man är rädd för bör man väl göra en nullcheck istället, annars kommer man ju bara utföra efterkommande operationer på strängen "null".

I båda fallen (cast till String vs. appenda tom sträng) så kommer toString() att anropas på objektet, enda skillnaden är att vid cast kommer vi få null om det vi försöker omvandla är null, och i det andra fallet kommer vi få null representerat som sträng + en tom sträng. Och då är det första alternativet + nullcheck och felmeddelande om resultatet är null bättre, än att fortsätta och använda strängen "null" för efterkommande operationer.

Jag tänkte på RTE vid cast till String från något som inte är String eftersom returtypen är Object. Det är möjligt att toString körs implicit innan casten, jag har aldrig tänkt på saken, men då blir också resultatet att man castar en String till String.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Nutshell:

Vilken typ av exception syftar du på? Den enda jag kan komma på som man undviker om man gör så är NullPointerException, och är det sådana man är rädd för bör man väl göra en nullcheck istället, annars kommer man ju bara utföra efterkommande operationer på strängen "null".

I båda fallen (cast till String vs. appenda tom sträng) så kommer toString() att anropas på objektet, enda skillnaden är att vid cast kommer vi få null om det vi försöker omvandla är null, och i det andra fallet kommer vi få null representerat som sträng + en tom sträng. Och då är det första alternativet + nullcheck och felmeddelande om resultatet är null bättre, än att fortsätta och använda strängen "null" för efterkommande operationer.

Ursäkta dubbelcitering. Jag fick precis möjlighet att testa följande kodsnutt, som resulterar i RTE:

class Main { public static void main (String[] args) throws java.lang.Exception { String s = (String)getSelectedValue(); System.out.println(s); } public static Object getSelectedValue() { return new Double(42.0); } }

I och med att getSelectedValue returnerar Object föreställer jag mig att den inte nödvändigtvis returnerar en sträng.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Ursäkta dubbelcitering. Jag fick precis möjlighet att testa följande kodsnutt, som resulterar i RTE:

class Main { public static void main (String[] args) throws java.lang.Exception { String s = (String)getSelectedValue(); System.out.println(s); } public static Object getSelectedValue() { return new Double(42.0); } }

I och med att getSelectedValue returnerar Object föreställer jag mig att den inte nödvändigtvis returnerar en sträng.

Okej det har du rätt i. Om programmet i första-posten skulle få något annat än en sträng i ett visst format så skulle programmet ändå bete sig oväntat. Men ja, som sagt innan så beror det på hur mycket felhantering man vill slänga på.

Visa signatur

"The devil will find work for idle hands to do."