[JAVA] String omdraaien

Pagina: 1
Acties:
  • 651 views sinds 30-01-2008
  • Reageer

  • Nibble
  • Registratie: Juli 2001
  • Laatst online: 31-08 12:10
(ben even met java aan het oefenen)
De titel zegt genoeg, maar dit pakt hij niet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private String draaiom(String zin){
        
        //vars
        String returnstring;
        int i;
        int stringchars = zin.length();      
        
        //draai zin om
        for (i=0; i < stringchars ;i++){
           returnstring.charAt(zin.length() - i).copyValueOf(zin.charAt(i));           
           
        //geef return waarde
        return returnstring;
        }
        
    }


met als melding:

code:
1
2
3
JavaTestApp1/Applet.java [27:1] char cannot be dereferenced
           returnstring.charAt(zin.length() - i).copyValueOf(zin.charAt(i));           
                              ^


iemand een hint hoe het wel moet ?

T is for TANK, and T is for TERROR ... and K is the K for KILLING in error.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Uhhh.. ik adviseer je om eerst een tutorial door te lezen want dit is echt onzin. Kijk maar op mijn site..

En een (van de vele) dingen die jij fout doet is dat jij een string probeerd aan te passen. Java strings zijn immutable, dus kunnen niet veranderd worden.

Daarnaast heb je trouwens helemaal geen return string geinitialiseerd (dus NullPointerException onder het runnen), waarom copy je een char? En je kan variablen lokaal declaren

En verder kan hier een slotje op.

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 21:29

The Eagle

I wear my sunglasses at night

Helemaal mee eens. Bovendien, Java lijkt qua syntax vrij sterk op C, en ik weet zeker dat dit soort zaken in ieder goed C-boek te vinden moeten zijn

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Waarden moet je toekennen aan variabelen, niet aan methoden. In dit geval zul je een methode setCharAt(pos, char) achtige methode moeten gebruiken. Deze is er echter niet. Misschien kun je beter een char array aanmaken van de juiste lengte, hierin de tekens zetten en tot slot deze omzetten naar een string.

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


  • Nibble
  • Registratie: Juli 2001
  • Laatst online: 31-08 12:10
Alarmnummer schreef op 19 september 2002 @ 16:33:
Uhhh.. ik adviseer je om eerst een tutorial door te lezen want dit is echt onzin. Kijk maar op mijn site..

En een (van de vele) dingen die jij fout doet is dat jij een string probeerd aan te passen. Java strings zijn immutable, dus kunnen niet veranderd worden.

En verder kan hier een slotje op.
:( wat is dit voor een reply!
Zeg dan niets. ik probeer alleen een string chargewijs te kopieren met omgekeerde volgorde. niet te hersorteren man!
Dus hier kan definetly _geen_ slotje op.
En wat betreft die tutuorial, ik zit hier met een boek van 680 pagina's voor mijn neus. Kijk als je niets wilt zeggen laat het dan ook.

T is for TANK, and T is for TERROR ... and K is the K for KILLING in error.


  • Nibble
  • Registratie: Juli 2001
  • Laatst online: 31-08 12:10
Janoz schreef op 19 september 2002 @ 16:35:
Waarden moet je toekennen aan variabelen, niet aan methoden. In dit geval zul je een methode setCharAt(pos, char) achtige methode moeten gebruiken. Deze is er echter niet. Misschien kun je beter een char array aanmaken van de juiste lengte, hierin de tekens zetten en tot slot deze omzetten naar een string.
thanks :)!

T is for TANK, and T is for TERROR ... and K is the K for KILLING in error.


Verwijderd

The_Eagle schreef op 19 september 2002 @ 16:34:en ik weet zeker dat dit soort zaken in ieder goed C-boek te vinden moeten zijn
nou nee dat lijkt me sterk, aangezien String handling onder C heeeel anders gaat als onder Java

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Nibble schreef op 19 september 2002 @ 16:36:
[...]


:( wat is dit voor een reply!
Dit is een RTFM reply

  • MisterData
  • Registratie: September 2001
  • Laatst online: 26-08 21:52
Misschien een StringBuffer gebruiken :?

Verwijderd

Nog makkelijker is om een StringBuffer aan te maken, en vervolgens de .reverse() method te gebruiken, zie http://java.sun.com/j2se/...va/lang/StringBuffer.html

Enjoy :)

edit:

Great minds think alike ... and at the same time as well appearantly ;)

[ Voor 0% gewijzigd door Verwijderd op 19-09-2002 16:45 . Reden: Woei! ]


  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Verwijderd schreef op 19 september 2002 @ 16:38:
nou nee dat lijkt me sterk, aangezien String handling onder C heeeel anders gaat als onder Java
Okee vooruit, C++ dan :P

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op 19 september 2002 @ 16:44:
Nog makkelijker is om een StringBuffer aan te maken, en vervolgens de .reverse() method te gebruiken, zie http://java.sun.com/j2se/...va/lang/StringBuffer.html

Enjoy :)

edit:
Great minds think alike ... and at the same time as well appearantly ;)


Uiteraard groot gelijk, maar het leek mij meer een projectje om het programmeren onder de knie te krijgen. Tuurlijk is het gebruik van standaard methoden beter dan alles zelf telkens opnieuw maken, maar voor het leren kan het best wel eens handig zijn om het zonder die methoden in elkaar te klussen.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Alarmnummer schreef op 19 september 2002 @ 16:33:

En verder kan hier een slotje op.


Ik denk niet dat een slotje hier van toepassing is.

https://fgheysels.github.io/


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier


Zeg dan ajb gewoon niets.

Het voegt niks toe aan de thread, behalve een gespannen lading slechte sfeer.

(en ja, dit is een "newbe java" topic, dat zag ik ook wel ;) )

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dit probleem had hij goed op kunnen lossen als hij zich enigsinds had verdiept in java, vandaar the RTFM. En verder staat in zijn profiel dat hij programmeur is en dan moet je dit soort problemen toch op kunnen lossen, vandaar het slotje.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:33
Misschien kunnen we best terug on-topic gaan, want dit is niet echt de plaats om dit 'uit te vechten'/te bespreken.

https://fgheysels.github.io/


Verwijderd

dat lijkt me nou niet lekker zitten

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Verwijderd schreef op 19 september 2002 @ 16:54:
dat lijkt me nou niet lekker zitten
:D :D :D

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

Ik ben geen kei in Java omdat ik me voornamelijk bezig hou met VBA. Is het misshien niet makkelijk om het meer op zo'n manier te doen?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private String draaiom(String zin){
        
        //vars
        String originalstring;
        String modifiedstring;
        int i;
        int stringchars = zin.length();      

        modifiedstring="";
        //draai zin om
        for (i=stringchars; i <>0  ;i--){
           modifiedstring = modifiedstring + returnstring.charAt(i);           
           
        //geef return waarde
        return modifiedstring;
        }

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

De strings bij java zijn immutable, en dat betekend dat bij iedere iteratie 1 string object wordt aangemaakt. Je kan veel beter een array declareren met de lengte van de invoer string, en die even vullen met omgedraaide indexen en dat naar string converteren en terug sturen. Zie antwoord Janoz.

En volgens mij gaat er iets met je naamgeving mis.

  • rainmaker2k
  • Registratie: Juli 2002
  • Laatst online: 14-08 22:53
Nibble schreef op 19 september 2002 @ 16:30:
(ben even met java aan het oefenen)
De titel zegt genoeg, maar dit pakt hij niet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private String draaiom(String zin){
        
        //vars
        String returnstring;
        int i;
        int stringchars = zin.length();      
        
        //draai zin om
        for (i=0; i < stringchars ;i++){
           returnstring.charAt(zin.length() - i).copyValueOf(zin.charAt(i));           
           
        //geef return waarde
        return returnstring;
        }
        
    }


met als melding:

code:
1
2
3
JavaTestApp1/Applet.java [27:1] char cannot be dereferenced
           returnstring.charAt(zin.length() - i).copyValueOf(zin.charAt(i));           
                              ^


iemand een hint hoe het wel moet ?
Ten eerste met je sowieso de regel "return returnstring;" uit de for-loop halen. Ik neem aan dat Java je niet toelaat om heel erg vaak een returnvalue te geven.

Ten tweede kun je het veel beter doen door de for loop met deze 2 regels te vervangen:
code:
1
2
        for (i=0; i < stringchars ;i++)
           returnstring = returnstring + zin.charAt(zin.length() - i);

Ik hoop dat dit beter werkt.

Groeten van Kah

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ten 1e is hij onnodig traag, en ten tweede krijg je een index out of bounds probleem.

  • rainmaker2k
  • Registratie: Juli 2002
  • Laatst online: 14-08 22:53
Ooh ja... het is waarschijnlijk ook nog handig om de declaratie van String returnstring zo te initialiseren:
code:
1
  String returnstring = "";

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Alarmnummer: hadden jij, mbravenboer en ik daar niet ooit een topic over? (was een topic van iemand anders, maar wij hebben dat toen volgespamd met pogingen om het zo efficient mogelijk te maken)

even zoeken...

.edit: oh nee, dat was een string replace functie: [rml][ JAVA] string replacen[/rml]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dat was een character replace :) Hier valt niet zoveel aan te optimaliseren. Oplossing met die array is denk ik het snelste.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat zeg ik ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • silentsnow
  • Registratie: Maart 2001
  • Laatst online: 15-04-2013

silentsnow

« '-_-' »

W00t!! Ik snap waar jullie het over hebben :D Hebben die Java 2.0 lessen die ik nu volg dus toch zin :P


Ff vraagie, "zin.length". Je mag daar toch geen punt gebruiken?? Of is het een methode :?

The trade of the tools
[ me | specs ] Klipsch Promedia Ultra 5.1 + Sennheiser HD-590


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op ieder object mag je een methode uitvoeren, of een veld ophalen en dat kan je aangeven met die punt.

Verwijderd

private String draaiom(String zin)
{
String reverse = "";
int i;
for(i = zin.length() -1; i >= 0; i--)
{
reverse = reverse + zin.charAt(i);
}
return reverse; }
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dennis26: Lezen is ook een vak |:(

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Waarom maak je iedere keer een nieuwe string aan???

Strings in java zijn immutable, dus bij iedere iteratie wordt een nieuw string object aangemaakt. Dit is wel een correcte oplossing maar onnodig inefficient.

En verder kan je die teller declaratie ook in de fur lus doen:

code:
1
2
3
for(int k=0;k<10;k++){
    ...
}


Hierdoor is de scope van k beperkt tot de for-lus en dat is natuurlijk ook de bedoeling.

ps: je hebt ook een accolade te veel.

Verwijderd

ow ja zie het :S

Verwijderd

Waarom moet er trouwens altijd direct een slotje op? Die jongen probeert gewoon wat java te leren. Hij zal heus wel leesvoer erbij hebben, en er zal vast wel wat instaan over Strings en hoe je ze moet declareren en welke methodes er zijn voor Strings, maar je vind niet in elke tutorial of boek een probleem als "een String omdraaien".
Tja, tis ook maar mijn mening, maar kon het toch niet laten het ff te zeggen :P

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Omdat er echt syntactisch dingen foutgaan en verder is dit echt vrij basic stuff. Als iedereen een topicje gaat openen omdat ze niet zoeken dan gaat /14 echt een helpdeskachtige instantie worden en daardoor gaan de interessante mensen weg.

Ook maar even een poging van mij dan.
code:
1
2
3
4
5
6
7
private String draaiom(String zin){
    StringBuffer result = new StringBuffer(zin.length());
    for(int i = zin.length() -1; i >= 0; i--)
        result.append(zin.charAt(k));

    return result.toString();
}


Op welke afdeling ben je trouwens AIO en wat is het onderwerp van je onderzoek?

[ Voor 0% gewijzigd door Alarmnummer op 19-09-2002 17:45 . Reden: oeps.. syntactisch was het correct, semantisch alleen niet :z ]


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Alarmnummer schreef op 19 september 2002 @ 17:40:
Omdat er echt syntactisch dingen foutgaan en verder is dit echt vrij basic stuff. Als iedereen een topicje gaat openen omdat ze niet zoeken dan gaat /14 echt een helpdeskachtige instantie worden en daardoor gaan de interessante mensen weg.

Ook maar even een poging van mij dan.
code:
1
2
3
4
5
6
7
private String draaiom(String zin){
    StringBuffer result = new StringBuffer(zin.length());
    for(int i = zin.length() -1; i >= 0; i--)
        result.append(zin.charAt(k));

    return result.toString();
}


Op welke afdeling ben je trouwens AIO en wat is het onderwerp van je onderzoek?
Waarom niet zo?
Java:
1
2
3
4
5
6
private String draaiom(String zin)
{
    StringBuffer result = new StringBuffer(zin);
    result.reverse();
    return result.toString();
}

Of was dat niet de bedoeling? :) (in de zin van, je moet het zelf doen?)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

_Mo_ schreef op 19 september 2002 @ 17:51:
Of was dat niet de bedoeling? :) (in de zin van, je moet het zelf doen?)
Yep :) (zelf doen dus)

  • Reefer
  • Registratie: Mei 2000
  • Laatst online: 21-02-2025

Reefer

madness

ik heb zoiets moeten doen maar dan met een Stack, maar dat is zeker ook inefficient?
code:
1
2
3
4
5
6
7
8
Stack stack = new Stack();
for (int index = 0; index < string.length(); index++) {
    stack.push(new Character(string.charAt(index)));
}
for (int index = 0; index < string.length(); index++) {
    Character char1 = (Character)stack.pop();
            .........
}

A Breakbeat A Day Keeps Religion Away.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dit is nogal vrij inefficient. Ten 1e zit in die stack een array (omdat een Stack een Vector extends en een Vector heeft in zich een array). Deze array zal vervangen worden als een extra element er niet meer bij past. Dus het kan voorkomen dat meerdere keren die array vervangen moet worden.

Ten 2e maak je iedere keer een char object aan (anders kan hij inderdaad niet op de Stack), maar objecten aanmaken is niet gratis in java.

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
silentsnow schreef op 19 september 2002 @ 17:25:
W00t!! Ik snap waar jullie het over hebben :D Hebben die Java 2.0 lessen die ik nu volg dus toch zin :P


Ff vraagie, "zin.length". Je mag daar toch geen punt gebruiken?? Of is het een methode :?
hahaha zegt ie eerst dat die Java 2 lessen zin hebben! LOL!

.naam() = methode
.naam = property

Even als reactie op hierboven, gewoon een char array gebruiken. Array`s zijn nou eenmaal loei snel. Kan een stack, vector of wat dan ook niet tegenop.

En waarom wil iedereen steeds opnieuw het wiel uitvinden, gebruik gewoon wat er al is:

StringBuffer sb = new StringBuffer("stringetje");
sb.reverse();

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

CK schreef op 19 september 2002 @ 19:57:
[...]
hahaha zegt ie eerst dat die Java 2 lessen zin hebben! LOL!
Even als reactie op hierboven, gewoon een char array gebruiken. Array`s zijn nou eenmaal loei snel. Kan een stack, vector of wat dan ook niet tegenop.
Ik adviseer je even om in de vector/stack/arraylist/stringbuffer/string implementatie te kijken. (Voor de rest die er niet in kijken: al deze structuren heb in zich gewoon een array). Je hebt verder natuurlijk overhead door methode aanroepen.
StringBuffer sb = new StringBuffer("stringetje");
sb.reverse();
Het lijkt me handiger als je de volgende keer even goed leest ;)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

:D ;)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Alarmnummer schreef op 19 september 2002 @ 18:26:
Dit is nogal vrij inefficient. Ten 1e zit in die stack een array (omdat een Stack een Vector extends en een Vector heeft in zich een array). Deze array zal vervangen worden als een extra element er niet meer bij past. Dus het kan voorkomen dat meerdere keren die array vervangen moet worden.
Maar dat is met jou StringBuffer implementatie ook het geval. Die overhead heb je dus altijd. Daarbij kan je ook de initial capacity van je Stack meegeven bij de constructie (al gebeurde dat hier niet) waardoor de benodige buffer in 1 keer gealloceerd wordt. De lengte van de string is immer op voorhand bekend.

Ik weet trouwens niet precies welke strategie wordt gebruikt voor het uitbreiden van de buffer, maar ik kan me voorstellen dat de gereserveerde ruimte elke keer wordt verdubbeld en bij 16 ofzo begint. Het aantal keren dat opnieuw ruimte gealloceerd moet worden is dan hooguit in de orde van het logaritme van de lengte van de uiteindelijke string en dat valt dus wel aardig mee (met 6 reallocaties kan je al meer dan 1000 karakters kwijt).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je even goed had gekeken dan had je gezien dat mijn stringbuffer al met een goeie grote werd geinitialiseerd ;)

  • TheOneLLama
  • Registratie: Oktober 2000
  • Laatst online: 20-01-2022

TheOneLLama

A llama like no llama before

Soultaker schreef op 19 september 2002 @ 22:06:
[...]


Maar dat is met jou StringBuffer implementatie ook het geval. Die overhead heb je dus altijd. Daarbij kan je ook de initial capacity van je Stack meegeven bij de constructie (al gebeurde dat hier niet) waardoor de benodige buffer in 1 keer gealloceerd wordt. De lengte van de string is immer op voorhand bekend.

Ik weet trouwens niet precies welke strategie wordt gebruikt voor het uitbreiden van de buffer, maar ik kan me voorstellen dat de gereserveerde ruimte elke keer wordt verdubbeld en bij 16 ofzo begint. Het aantal keren dat opnieuw ruimte gealloceerd moet worden is dan hooguit in de orde van het logaritme van de lengte van de uiteindelijke string en dat valt dus wel aardig mee (met 6 reallocaties kan je al meer dan 1000 karakters kwijt).
Als je goed kijkt in de code van alarmnummer zie je dat ie z'n StringBuffer initialiseerd met de lengte van de String. Geen reallocaties dus. Dit zou je bij de Stack natuurlijk ook kunnen doen. Stack is in Java gebaseert op Vector. En in de Sun implementatie gebruiken Vector en StringBuffer dezelfde uitbreidingsstrategy.

Een Stack slaat echter objecten op, en de StringBuffer char's. Een char is eigenlijk gewoon een 16bit waarde en geeft dus veel minder overhead.

Bovendien worden voor het algoritme met de Stack grofweg twee keer zoveel operaties uitgevoerd. Waarom iets op je Stack pushen en dan weer popen als je dmv achterin je String beginnen het ook in 1 keer kan doen?

Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Alarmnummer schreef op 19 september 2002 @ 22:10:
Als je even goed had gekeken dan had je gezien dat mijn stringbuffer al met een goeie grote werd geinitialiseerd ;)
Je kritiek was dat er een Stack/Vector werd gebruikt in plaats van een StringBuffer, wat verkeerd zou zijn omdat de buffer dan gerealloceerd moest worden. Het ging me erom dat dat argument niet op gaat.

Dat die klasse vervolgens niet handig wordt gebruikt, tja... Daar kan ik ook niets aan doen. :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Mijn kritiek ging voornamelijk over het niet bekend maken van de grote waardoor je een aantal keer onnodig array copies moet maken. (En trouwens stack heeft ook geen init size bij de constructor |:( ) Maar schijnbaar is dit niet helemaal goed overgekomen.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Alarmnummer schreef op 19 september 2002 @ 23:19:
(En trouwens stack heeft ook geen init size bij de constructor |:( )
Dat is inderdaad een beetje jammer, maar gelukkig erft 'ie wel ensureCapacity() van de Vector klasse.
Pagina: 1