Toon posts:

[JAVA]Woord omdraaien

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

Verwijderd

Topicstarter
Hoe maak je het mogelijk, een woord om te draaien. En daarna te controleren of het een palindroom is. Ik heb het volgende, maar dan krijg je allerlei foutmeldingen, als je op de button drukt.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        String woord = invoer.getText();
        int lengte = woord.length();
        String omgekeerd = woord.substring(lengte,0);
        
        String ja = "JA!";
        String nee = "NEE!";
        
        if (woord.equals(omgekeerd))
        {
            uitvoer.setText(ja);
        }
        else
        {
            uitvoer.setText(nee);
        } 


deze lijst krijg je dan als foutmeldingen

code:
1
2
3
4
5
6
7
8
9
10
11
java.lang.StringIndexOutOfBoundsException: String index out of range: -3
    at java.lang.String.substring(String.java:1492)
    at Palindroom.Knop_ActionPerformed(Palindroom.java:59)
    at Palindroom$SymAction.actionPerformed(Palindroom.java:51)
    at java.awt.Button.processActionEvent(Button.java:308)
    at java.awt.Button.processEvent(Button.java:281)
    at java.awt.Component.dispatchEventImpl(Component.java:2394)
    at java.awt.Component.dispatchEvent(Component.java:2307)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:287)
    at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:103)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:83)

[ Voor 44% gewijzigd door Verwijderd op 09-01-2006 18:12 ]


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 14:06
Gokje:

String.length geeft het aantal characters in de String terug, maar de index loopt vanaf 0 ipv 1, dus als je length als upperbound gebruikt krijg je een hele mooie StringIndexOutOfBounds error ;)

Edit: Het gaat dus al eerder fout vanwege een beginindex die groter is dan de endindex, was me niet eens opgevallen :X

[ Voor 28% gewijzigd door Kwistnix op 09-01-2006 18:23 ]


  • Bergie
  • Registratie: Augustus 2000
  • Laatst online: 02-04 14:17

Bergie

Lekker belangrijk...

ik vermoed dat het fout gaat bij je substring methode, die verwacht waarschijnlijk een end index die hoger is dan de begin index.

edit : ja dus :)
IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.
Ik ben geen java kenner dus weet niet of er een ingebouwde methode is voor het omdraaien van een string, maar ik gok het van niet. Je zal dus waarschijnlijk zelf even een simpel lusje moeten schrijven dat de string omdraait.

[ Voor 70% gewijzigd door Bergie op 09-01-2006 18:17 ]

Yamaha MT-09


  • Sv3n
  • Registratie: Mei 2002
  • Laatst online: 13:02
Java:
1
2
3
4
5
6
7
8
9
10
int temp = woord.length();
char[] temparray;


while (temp >=0){
  temparray[woord.length()-temp] = woord.charAt[temp];
  temp--;
}

return new String(temparray); //het omgekeerde woord :) 


zal niet gelijk werken want ik heb t ff heel snel gedaan maar zo zou het moeten kunnen :) Die substring geeft de fout:
IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.

[ Voor 20% gewijzigd door Sv3n op 09-01-2006 18:31 ]

Last.fm
Films!


  • Cloud
  • Registratie: November 2001
  • Laatst online: 09-03 19:32

Cloud

FP ProMod

Ex-moderatie mobster

Kun je dit niet makkelijker in 1 keer controleren? Dus zoiets:

Java:
1
2
3
4
5
6
7
8
String woord = invoer.getText();
int lengte = woord.length();

for (int i = 0; i < lengte; i++)
{
  if (woord.charAt(i) != woord.charAt(lengte-i))
    return false; // geen palindroom
}


Het zou kunnen dat dit niet werkt, maar volgens mij is dit in elk geval wel een manier waarop je het kunt doen (kleine foutjes voorbehouden ;) )

edit:
pvd net iets te laat! 8)

[ Voor 6% gewijzigd door Cloud op 09-01-2006 18:21 ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • alx
  • Registratie: Maart 2002
  • Niet online

alx

Voor palindroom controle volstaat het om woordlengte / 2 checks te doen.
Maar ik weet niet of het doel van de TS is om op palindromen te controleren of om een woord om te draaien en dan het woord met het omgekeerde te vergelijken als palindroom controle.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Zo zou je een string kunnen omdraaien:
Java:
1
2
3
4
5
6
7
8
9
10
11
String omgekeerdWoord(String woord)
{
    String omgekeerd = "";
    
    for (int i = (woord.length - 1); i >= 0 ; i--)
    {
        omgekeerd += woord.charAt(i).toString();
    }
    
    return omgekeerd;
}

Ik weet niet of dit precies werkt in JAVA, want heb het niet getest, maar ik neem aan dat dit wel werkt.

Maar om een palindroom te checken, zou ik de code van wolkje gebruiken. Die is het meest efficient.

substring werkt alleen van voor naar achter, niet van achter naar voor.

[ Voor 34% gewijzigd door eghie op 09-01-2006 18:57 ]


Verwijderd

Volgens mij kun je het beste de eerste karakter met de laatste vergelijken. Daarna de tweede karakter met de een na laatste en zo verder. Als de karakters niet hetzelfde zijn is het dus geen palingdroom. Lijkt mij het meest efficient.

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

Het korste alternatief is volgens mij zoiets:
Java:
1
2
3
boolean isPalindroom(String woord) {
    return woord != null && new StringBuilder(woord).reverse().equals(woord);
}

Ik heb overigens geen idee hoe efficient dat is.

[ Voor 9% gewijzigd door NetForce1 op 09-01-2006 19:04 . Reden: signature fixed ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Cloud
  • Registratie: November 2001
  • Laatst online: 09-03 19:32

Cloud

FP ProMod

Ex-moderatie mobster

simulacrum schreef op maandag 09 januari 2006 @ 18:31:
Voor palindroom controle volstaat het om woordlengte / 2 checks te doen.
Ah dit is correct! Ik wist dat ik iets vergeten was. Heb dit ooit ook eens voor m'n studie moeten doen :)
NetForce1 schreef op maandag 09 januari 2006 @ 18:58:
Het korste alternatief is volgens mij zoiets:
Java:
1
2
3
boolean isPalindroom(String woord) {
    return woord != null && new StringBuilder(woord).reverse().equals(woord);
}

Ik heb overigens geen idee hoe efficient dat is.
Hmm geen idee hoe efficient StringBuilder, maar ik denk dat dit toch ook best wel een efficiente oplossing is :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17:51

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op maandag 09 januari 2006 @ 18:08:
Hoe maak je het mogelijk, een woord om te draaien. En daarna te controleren of het een palindroom is. Ik heb het volgende, maar dan krijg je allerlei foutmeldingen, als je op de button drukt.
Volgende keer ietsje meer moeite doen mag wel hoor. Zie ook P&W FAQ - De "quickstart". We verwachten hier iets meer van je voordat je een topic opent, zoals eerst zelf opzoek naar een oplossing, eens wat documentatie lezen over de methods die je gebruikt etc. ;).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 12:53

Robtimus

me Robtimus no like you

NetForce1 schreef op maandag 09 januari 2006 @ 18:58:
Het korste alternatief is volgens mij zoiets:
Java:
1
2
3
boolean isPalindroom(String woord) {
    return woord != null && new StringBuilder(woord).reverse().equals(woord);
}

Ik heb overigens geen idee hoe efficient dat is.
Ik betwijfel of dit goed gaat werken. Ik zou ook gewoon de API gebruiken en een StringBuilder of StringBuffer gebruiken om te reversen, maar als een StringBuilder object (return waarde van reverse()) gelijk is aan een String object eet ik mijn pet op.

new StringBuilder(woord).reverse().toString().equals(woord) daarentegen zou wel moeten werken.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

IceManX schreef op maandag 09 januari 2006 @ 20:49:
[...]
Ik betwijfel of dit goed gaat werken. Ik zou ook gewoon de API gebruiken en een StringBuilder of StringBuffer gebruiken om te reversen, maar als een StringBuilder object (return waarde van reverse()) gelijk is aan een String object eet ik mijn pet op.

new StringBuilder(woord).reverse().toString().equals(woord) daarentegen zou wel moeten werken.
Je hebt uiteraard gelijk, beter opletten voortaan 8)

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 12:53

Robtimus

me Robtimus no like you

Qua efficientie wint trouwens denk ik de oplossing van wolkje icm de opmerking van simulacrum.

Hoewel een string vergelijken met zijn omgedraaide versie het meest correct lijkt maakt je hier wel 2 extra objecten aan (StringBuilder en de string uit toStirng - geheugen inefficienter) en ben je toch door de string aan het lopen (orde N) voor het reversen, plus door de string lopen voor vergelijking (orde N). Al met al een orde N algoritme met 2 extra objecten.

Dan is dit minstens net zo efficient (ook orde N, geen extra objecten):
Java:
1
2
3
4
5
6
7
8
9
String woord = invoer.getText();
int lengte = woord.length();

for (int i = 0; i < lengte / 2; i++) {
    if (woord.charAt(i) != woord.charAt(lengte - i - 1)) {
        return false; // geen palindroom
    }
}
return true;
Als lengte oneven is dan mis je het middelste karakter wel, maar dat hoef je niet te controleren.

Vergeet trouwens niet die lengte - i - 1, omdat je t/m lengte - 1 kunt gaan.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

nevermind

[ Voor 84% gewijzigd door Verwijderd op 10-01-2006 10:17 ]

Pagina: 1