Avatar billede willi Nybegynder
27. januar 2003 - 16:49 Der er 14 kommentarer og
1 løsning

Fjerne et ord i en tekst streng

Jeg har lavet følgende kode:


    String test = "ftdsatest  test  test    test fdsa test testOK fdsa as dsaf fdsa 432 dsa";
       
for( int i = 0; i < test.length(); i++)
    {    if(test.charAt(i)==(' '))
       
            {        if(test.charAt(i+1)==('t'))
                        if(test.charAt(i+2)==('e'))
                        if(test.charAt(i+3)==('s'))
                            if(test.charAt(i+4)==('t'))

                        System.out.println("Substring " + i);



            }

        }

Den er for så vidt meget god.
Den viser hvor ordet "test" begynder.
Den giver også mulighed for at lave alternativer i et ord som f,eks. "ø" eller "oe".

Men jeg er kørt lidt træt.
Hvordan skal jeg få selve tekst strengen printet ud.
Altså det som ikke er ordet "test".

Jeg vil gerne bibeholde "strukturen" uden tokenizer.
Avatar billede jakoba Nybegynder
27. januar 2003 - 17:14 #1
for( int i = 0; i < test.length(); i++)
    {    if(test.charAt(i)==(' '))
     
            {        if(test.charAt(i+1)==('t'))
                        if(test.charAt(i+2)==('e'))
                        if(test.charAt(i+3)==('s'))
                            if(test.charAt(i+4)==('t')) {

                                System.out.println(test.substring(0,i+1));
                                System.out.println(test.substring(i+5));
                            }

            }

        }

mvh JakobA
Avatar billede arne_v Ekspert
27. januar 2003 - 17:23 #2
Se:
  http://www.eksperten.dk/spm/309158
der er masser af forskellig kode !
Avatar billede willi Nybegynder
27. januar 2003 - 17:24 #3
Det bliver ikke helt som forventet:

(output)
ftdsatest 
  test    test fdsa test testOK fdsa as dsaf fdsa 432 dsa
ftdsatest  test 
    test fdsa test testOK fdsa as dsaf fdsa 432 dsa
ftdsatest  test  test   
fdsa test testOK fdsa as dsaf fdsa 432 dsa
ftdsatest  test  test    test fdsa
testOK fdsa as dsaf fdsa 432 dsa
ftdsatest  test  test    test fdsa test
OK fdsa as dsaf fdsa 432 dsa

Jeg forventer et output som ser sådan ud:

"ftdsatest fdsa testOK fdsa as dsaf fdsa 432 dsa"

Dvs at kun hvor der inden ordet "test" er en space, bliver ordet "til" et rigtigt ord.
Avatar billede arne_v Ekspert
27. januar 2003 - 17:25 #4
Du vælger en af de replaceAll funktioner og bruger:

String test = "ftdsatest  test  test    test fdsa test testOK fdsa as dsaf fdsa 432 dsa";
       
System.out.println(replaceAll(test, "test", ""));
Avatar billede arne_v Ekspert
27. januar 2003 - 17:26 #5
Hvis du bruger JDK 1.4+ kan du bare bruge:

System.out.println(test.replaceAll("test", ""));

da JDK 1.4+ String har en replaceAll indbygget.
Avatar billede willi Nybegynder
27. januar 2003 - 17:32 #6
Meget interessant Arne. Jeg vender tilbage.
Avatar billede mipe1 Nybegynder
27. januar 2003 - 22:18 #7
En mulighed kunne måske også være at skrive en "replaceAll" noget i stil med dette:

public static String replaceAll(String str, String replace, String with){
  int index = str.indexOf(replace);
  if(index!=-1){
    return str.substring(0,index)+with+replaceAll(str.substring(index+replace.length()),replace,with);           
  }else{
    return str;
  }
}

resultatet af
String test = "ftdsatest  test  test    test fdsa test testOK fdsa as dsaf fdsa 432 dsa";

System.out.println(replaceAll(test," test "," "));

bliver:
ftdsatest      fdsa testOK fdsa as dsaf fdsa 432 dsa
Avatar billede willi Nybegynder
28. januar 2003 - 13:00 #8
Det er rigtigt.
Men jeg vil gerne undgå at benytte metoden replaceAll.
Den kan - så vidt jeg forstår - kun benyttes i JVM1.4
Avatar billede arne_v Ekspert
28. januar 2003 - 13:05 #9
Det er også helt fint.

Hvis du følger det link jeg gav kan du finde masser af
replaceAll metoder som virker på alle java versioner.

Der er sågar hastigheds-målinger på dem, hvis performance skulle
være vigtig.
Avatar billede willi Nybegynder
28. januar 2003 - 13:11 #10
Jeg har set på det arne_v.
Ser stadig. Det er noget af en fortælling  ;-)
Avatar billede willi Nybegynder
01. februar 2003 - 15:26 #11
Hvis jeg læser i Javabog (http://javabog.dk/OOP/kapitel3.html) er der nogle spørgsmål som ikke forudsætter replaceAll, tokenizer m.m..
I det kapitel jeg har gennemlæst (kap. 3) skulle opgaven alene kunne løses med substring, indexOf, løkker osv.

Er der nogen som kan give mig en anvisning på hvordan?


3.4.6 Opgaver
Skriv et program, der finder positionen af det første mellemrum i en streng.
(vink: Brug metoden indexOf(" "))

Skriv et program, der fjerner det første ord i en sætning (indtil første mellemrum).

Skriv et program, der fjerner den første forekomst af ordet "måske" fra en tekst.
Ændr derefter programmet, så det fjerner alle forekomster af ordet (brug en løkke).

Skriv et program, der finder og fjerner alle forekomster af ordet "måske" fra en tekst, uanset om det er skrevet med store eller små bogstaver.

Skriv et program, der tæller antallet af kommaer i en tekst.
Avatar billede arne_v Ekspert
01. februar 2003 - 15:56 #12
Det er jo de teknikker som også er blevet brugt i de replaceAll
metoder:

for loop eller rekursion
indexOf
substring

om man putter det i en separat metode eller ej betyder jo ikke
noget for de features man bruger (det er bare pænt at putte en
generel feature i en separat metode).
Avatar billede arne_v Ekspert
01. februar 2003 - 16:02 #13
De konkrete opgaver:

int pos = s.indexOf(" ");

----

int pos = s.indexOf(" ");
String s2 = s.substring(pos);

----

int pos = s.indexOf("måske");
String s2 = s.subtring(0, pos) + s.substring(pos+5);

----

      StringBuffer tmp = new StringBuffer("");
      int pos = 0;
      while (pos < s.length()) {
        int ix = s.indexOf("måske", pos);
        if (ix >= 0) {
            tmp.append(s.substring(pos, ix));
            pos = ix + 5;
        } else {
            tmp.append(s.substring(pos));
            pos = s.length();
        }
      }
      String s2 = tmp.toString();
Avatar billede arne_v Ekspert
01. februar 2003 - 16:05 #14
String sup = s.toUpperCase();
      StringBuffer tmp = new StringBuffer("");
      int pos = 0;
      while (pos < s.length()) {
        int ix = sup.indexOf("MÅSKE", pos);
        if (ix >= 0) {
            tmp.append(s.substring(pos, ix));
            pos = ix + 5;
        } else {
            tmp.append(s.substring(pos));
            pos = s.length();
        }
      }
      String s2 = tmp.toString();

----

int count = 0;
for(int i = 0; i < s.length; i++) {
    if(s.charAt(i) == ',') {
        count++;
    }
}
Avatar billede willi Nybegynder
01. februar 2003 - 17:24 #15
Du skal have dine point arne_v.
Men når man går slavisk frem efter bogen, skulle opgave løses uden StringBuffer.
Det forekom mig svært.
Tak for hjælp og tålmodighed.
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