Avatar billede rasmuslarsen2 Nybegynder
06. juli 2005 - 13:49 Der er 8 kommentarer og
1 løsning

Subtring giver fejl

Hej igen, hehe :P

Nu er mit problem noget med strenge... jeg har lavet dette lille program som en opgave i javabog.dk:

http://javabog.dk/OOP/kapitel3.jsp#afsn3.4.6

Det er opgave 4 der er problemet, her er min kode:


class  Maaske2
{
    public static void main(String[] args)
    {
        String tekst, tekst2, mål, før, efter;
        int i;

        tekst = "Ja, jeg kommer MåSkE. Ja Måske, nej, jo MÅSKE, men kun måske,Måske"; // Skriv her teksten hvorfra målet skal fjernes!
        mål = "måske"; //Skriv her målet, som ønskes slettet fra ovenstående tekst!

        System.out.println("Tekst variablen inden: " + tekst);

        tekst2 = tekst.toLowerCase();
        i = tekst2.indexOf(mål);
        while (i != -1)
        {
            efter = tekst.substring(i + mål.length());
            før = tekst.substring(0, i);
            tekst = før + efter;
            i = tekst2.indexOf(mål);
        }

        tekst.trim();

        System.out.println();
        System.out.println("Tekst variablen efter: " + tekst);

    }
}


Jeg kan godt compile den, men når den køres, stopper den ved linie 17 eller sådan noget:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -4
    at java.lang.String.substring(String.java:1768)
    at java.lang.String.substring(String.java:1735)
    at Maaske2.main(Maaske2.java:17)


Jeg kan virkelig ikke forstå hvorfor den giver fejl ved det her, kan i hjælpe?
Avatar billede jpvj Nybegynder
06. juli 2005 - 14:00 #1
prøv at rette
    i = tekst2.indexOf(mål);
til
    i = tekst.indexOf(mål);

eller kommer du til at indexere ud fra original strengen...
Avatar billede rasmuslarsen2 Nybegynder
06. juli 2005 - 14:07 #2
Jaja, det har jeg også prøvet, men hvis jeg bruger tekst.indexOf(mål); så finder den jo kun dem der er skrevet med kun små bogstaver (opgaven går udpå at den finder dem ikke kun med små bogstaver også).

Derfor har jeg lavet tekst2 som er tekst bare i lowercase, så skulle den jo kunne finde alle da de alle er lowercase som mål.

Men, hvis jeg ellers bare lavede tekst lowercase og gjorde det samme, så ville de andre bogstaver jo stadig være lowercase, og det er jo ikke godt.

Men kan man da lave en tekst lowercase og så bagefter sige sådan noget undoLowerCase agtigt noget?
Avatar billede mikkelbm Nybegynder
06. juli 2005 - 17:53 #3
Sådan her vil jeg gøre det:

public class Eksperten630826
{
    public static void main (String[] args)
    {
        String text = "Team CSC Vinder måske tour'en i år";
        String remove = "måske";
       
        int index = indexOfIgnoreCase (text, remove);
       
        if (index >= 0) // Hvis den finder noget er index større eller lig med 0
        {
            text = remove (text, index, index + remove.length());
            System.out.println (text);
        }
    }
   
    public static String remove (String text, int start, int end)
    {
        String before = text.substring(0, start);
        String after = text.substring(end);
        return before + after;
    }   
   
    public static int indexOfIgnoreCase (String text, String indexOf)
    {
        text = text.toLowerCase();
        indexOf = indexOf.toLowerCase();
       
        return text.indexOf(indexOf);
    }
}


Håber du kan bruge det...
Avatar billede mikkelbm Nybegynder
06. juli 2005 - 18:05 #4
Hov. Opdager først nu, at som du rigtigt har taget højde for, kan være flere forekomster af teksten. Så derfor er det rigtigt som du gør med at have en while-løkke.  :)
Avatar billede rasmuslarsen2 Nybegynder
06. juli 2005 - 18:33 #5
public class Maaske2
{
    public static void main (String[] args)
    {
        String text = "Team CSC Vinder måske tour'en i år";
        String remove = "måske";
     
        int index = indexOfIgnoreCase (text, remove);
        int x = 0;
     
      while (x < text.length())
      {
              if (index >= 0) // Hvis den finder noget er index større eller lig med 0
              {
                  text = remove (text, index, index + remove.length());
            }
        x++;
      }
      System.out.println (text);
     
    }
 
    public static String remove (String text, int start, int end)
    {
        String before = text.substring(0, start);
        String after = text.substring(end);
        return before + after;
    } 
 
    public static int indexOfIgnoreCase (String text, String indexOf)
    {
        text = text.toLowerCase();
        indexOf = indexOf.toLowerCase();
     
        return text.indexOf(indexOf);
    }
}

Sådan her mener du?

Det virker heller ikke samme fejl som med min kode :/
Avatar billede mikkelbm Nybegynder
06. juli 2005 - 20:48 #6
Sådan her:

public class Eksperten630826
{
    public static void main (String[] args)
    {
        String text = "Team CSC Vinder måske tour'en i år og måske ikke";
        String remove = "mÅske";
       
       
        int index = indexOfIgnoreCase (text, remove);
        while (index >= 0)
        {
            text = remove (text, index, index + remove.length());
            index = indexOfIgnoreCase (text, remove);
        }
       
        System.out.println (text);
    }
   
    public static String remove (String text, int start, int end)
    {
        String before = text.substring(0, start);
        String after = text.substring(end);
        return before + after;
    }   
   
    public static int indexOfIgnoreCase (String text, String indexOf)
    {
        text = text.toLowerCase();
        indexOf = indexOf.toLowerCase();
       
        return text.indexOf(indexOf);
    }
}
Avatar billede rasmuslarsen2 Nybegynder
06. juli 2005 - 22:45 #7
Tak
Avatar billede arne_v Ekspert
07. juli 2005 - 00:02 #8
det er næppe i Java bog's ånd men der er faktisk nogle nyttige features i Java 1.4 og nyere:

package july;

import java.util.regex.Pattern;

public class SpecialReplace {
    public static void main(String[] args) {
        String text = "Team CSC Vinder MÅSKE tour'en i år og måske ikke";
        System.out.println(text.replaceAll("MÅSKE", ""));
        System.out.println(Pattern.compile("MÅSKE", Pattern.CASE_INSENSITIVE + Pattern.UNICODE_CASE).matcher(text).replaceAll(""));
    }
}
Avatar billede mikkelbm Nybegynder
07. juli 2005 - 00:11 #9
Tænkte nok der var en indbygget mekanisme til det, men det var ikke en jeg kendte :)

Men smart er det nu.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester