Avatar billede Slettet bruger
27. marts 2003 - 13:56 Der er 29 kommentarer og
1 løsning

tokenizer problemer

Er der ikke nogen der kan hjælpe mig med min Javaopgave?? jeg skal have Purify til at fjerne liniskift, kommaer, udråbstegn og spørgsmålstegn fra teksten og erstatte dem med blanktegn, og i stedet bare spytte de 'rene ord' ud. Jeg kan ikke få det til at virke, og er helt blank på hvordan jeg kommer videre... 

Min Purify klasse ser sådan her ud:

/**
* @author TINE
* @version 23032003
*/

import java.util.StringTokenizer;

public class Purify implements StringHolder {
   
    private String text = null;
    private static final char sep = '/';
    StringTokenizer tokenizer;
   

    public Purify (String t) {
        text = t;
    }

    // --- accessors ---

    public String getTransformation() {
        return "Purify";
    }
   
    public String getTransformed() {
        tokenizer = new StringTokenizer(text);
        StringBuffer sb= new StringBuffer();
        String token;

      while (tokenizer.hasMoreTokens()){
            token = tokenizer.nextToken();
        }
       
        return sb.toString();
    }
   
}


og min applet sådan her:

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/**
* @author JCC
* @version 10 okt 02
*/

public class StringAnalyzer extends Applet implements ActionListener {

    private WrappedTextArea area = new WrappedTextArea(10, 50); 
    private Button setButton = new Button("Set");
    private Button orgButton = new Button("Original");
    private Button lcaseButton = new Button("Lowercase");
    private Button ucaseButton = new Button("Uppercase");
    private Button purifyButton = new Button("Purify");

   
    private final StringHolder empty = new EmptyText();
    private StringHolder original;
    private StringHolder lowercased;
    private StringHolder uppercased;
    private StringHolder purified;

    private boolean isAnalyzing;

    public void init() {
        setBackground(new Color(200, 240, 240));
        setSize(450, 250);
        add(area);
        add(setButton);
        add(orgButton);
        add(lcaseButton);
        add(ucaseButton);
        add(purifyButton);

        setAnalyzeMode(false);

        setButton.addActionListener(this);
        orgButton.addActionListener(this);
        lcaseButton.addActionListener(this);
        ucaseButton.addActionListener(this);
        purifyButton.addActionListener(this);
    }

    public void setAnalyzeMode(boolean is) {
        isAnalyzing = is;
        showStatus("isAnalysing = " + isAnalyzing);
        lcaseButton.setEnabled(isAnalyzing);
        ucaseButton.setEnabled(isAnalyzing);
        orgButton.setEnabled(isAnalyzing);
        purifyButton.setEnabled(isAnalyzing);
        if (isAnalyzing) {
            setButton.setLabel("Clear");
            area.setEditable(false);
        } else {
            setButton.setLabel("Set");
            area.setText(empty);
            area.setEditable(true);
        }     
    }
   
    public void actionPerformed(ActionEvent e) {
        Button button = (Button) (e.getSource());
        if (button == orgButton) {
            area.setText(original);
        } else if (button == lcaseButton) {
            area.setText(lowercased);
        } else if (button == ucaseButton) {
            area.setText(uppercased);
        } else if (button == purifyButton) {
            area.setText(purified);       
        } else if (button == setButton) {
            if (isAnalyzing) {
                setAnalyzeMode(false);

            } else {
                String newText = area.getText();
                original = new OriginalText(newText);
                lowercased = new LowercaseText(newText);
                uppercased = new UppercaseText(newText);
                purified = new Purify(newText);
                setAnalyzeMode(true);
            }
        }
        validate();
    }
}
Avatar billede arne_v Ekspert
27. marts 2003 - 14:03 #1
Prøv med:

  public String getTransformed() {
        tokenizer = new StringTokenizer(text, "\n,!?");
        StringBuffer sb = new StringBuffer();

        while (tokenizer.hasMoreTokens()){
            sb.append(" ");
            sb.append(tokenizer.nextToken());
        }
       
        return sb.toString();
    }
Avatar billede arne_v Ekspert
27. marts 2003 - 14:04 #2
Hvis du vil være fri for det første mellemrum (og du ved der er mindst et token):

    public String getTransformed() {
        tokenizer = new StringTokenizer(text, "\n,!?");
        StringBuffer sb = new StringBuffer(tokenizer.nextToken());

        while (tokenizer.hasMoreTokens()){
            sb.append(" ");
            sb.append(tokenizer.nextToken());
        }
       
        return sb.toString();
    }
Avatar billede arne_v Ekspert
27. marts 2003 - 14:06 #3
Når så du skal have noget renset:

String s;
...
Purify pur = new Purify(s);
String  s2 = pur.getTransformed();
Avatar billede arne_v Ekspert
27. marts 2003 - 14:10 #4
Jeg ville nok iøvrigt have lavet det som:

    public String getTransformed() {
        StringBuffer sb = new StringBuffer("");
        for(int i = 0; i < text.length(); i++) {
            switch(text.charAt(i)) {
                case '\n':
                case ',':
                case '!':
                case '?':
                    sb.append(" ");
                    break;
                default:
                    sb.append(text.charAt(i));
                    break;
            }
        }
        return sb.toString();
    }
Avatar billede Slettet bruger
27. marts 2003 - 14:24 #5
Juhuu.. nu virker det! Tak!

Men kan du ikke lige hjælpe mig med én ting til? Så skal du nok få dine point :-)

Hvis nu jeg skal have den til at erstatte alt det der ikke er rene ord eller blanktegn (fx & eller 3dje) med en stjerne (*). Hvordan gør jeg så det?
Avatar billede arne_v Ekspert
27. marts 2003 - 14:33 #6
Så tror jeg at for løkken er mere fleksibel.

Måske noget i retning af:

    public String getTransformed() {
        StringBuffer sb = new StringBuffer("");
        for(int i = 0; i < text.length(); i++) {
            switch(text.charAt(i)) {
                case '\n':
                case ',':
                case '!':
                case '?':
                    sb.append(" ");
                    break;
                default:
                    if(Character.isLetter(text.charAt(i))) {
                        sb.append(text.charAt(i));
                    } else {
                        sb.append("*");
                    }
                    break;
            }
        }
        return sb.toString();
    }

Den vil transformere "a,b&o" til "a b*o".
Avatar billede Slettet bruger
27. marts 2003 - 14:41 #7
Min ser sådan her ud:

    public String getTransformed() {
        tokenizer = new StringTokenizer(text, "\n,.!?");
        StringBuffer sb= new StringBuffer();

      while (tokenizer.hasMoreTokens()){
            sb.append(" ");
            sb.append(tokenizer.nextToken());
               
         
        }
       
        return sb.toString();
    }
   
}


Så har jeg jo ikke defineret i, men skal vel brúge noget med nextToken???

Det er meningen at "b&o" skal blive til "*" 

Jeg ved godt at jeg stiller dumme spørgsmål, men jeg er ret ny ud i det her :-)

Tine
Avatar billede arne_v Ekspert
27. marts 2003 - 14:44 #8
Nå. Du vil have alle ord som indeholder mærkelige tegn lavet til * ?

Altså "bo" -> "bo" men "b&o" -> "*" ?
Avatar billede arne_v Ekspert
27. marts 2003 - 14:45 #9
Iøvrigt er de enset dumme spørgsmål dem der ike bliver stillet.
Avatar billede Slettet bruger
27. marts 2003 - 14:47 #10
Jep, det er det jeg vil...
Avatar billede arne_v Ekspert
27. marts 2003 - 14:47 #11
Måske noget i retning af:

    public String getTransformed() {
        tokenizer = new StringTokenizer(text, "\n,.!?");
        StringBuffer sb= new StringBuffer();

      while (tokenizer.hasMoreTokens()){
            sb.append(" ");
            sb.append(tokenizer.nextToken());
               
         
        }
         
        String res = sb.toString();

        for(int i = 0; i < res.length(); i++) {
            if(!Character.isLetter(res.charAt(i))) {
                return "*";
            }
        }

        return res;
    }
Avatar billede arne_v Ekspert
27. marts 2003 - 14:48 #12
Nej.

Duer ikke.

Den virker kun med et ord.
Avatar billede arne_v Ekspert
27. marts 2003 - 14:51 #13
public String getTransformed() {
        tokenizer = new StringTokenizer(text, "\n,.!?");
        StringBuffer sb= new StringBuffer();

      while (tokenizer.hasMoreTokens()){
            sb.append(" ");
            String t = tokenizer.nextToken();
            boolean realword = true;

            for(int i = 0; i < t.length(); i++) {
                if(!Character.isLetter(t.charAt(i))) {
                    realword = false;
                }
            }

            if(realword) {
                sb.append(t);
            } else {
                sb.append("*");
            }
         
        }
         
        return sb.toString();
    }
Avatar billede Slettet bruger
27. marts 2003 - 15:02 #14
Nu spytter den KUN stjerne ud...

    public String getTransformation() {
        return "Purify";
    }
   
    public String getTransformed() {
        tokenizer = new StringTokenizer(text, "\n,.!?");
        StringBuffer sb= new StringBuffer();

      while (tokenizer.hasMoreTokens()){
            sb.append(" ");
            String t = tokenizer.nextToken();
            boolean realword = true;
           
            for(int i = 0; i < t.length(); i++){
            if(!Character.isLetter(t.charAt(i))) {
                    realword = false;
                }
            }       

          if(realword){
          sb.append(t);   
          } 
          else {
          sb.append("*");
          }
         
        }
       
        return sb.toString();
    }
   
}
Avatar billede arne_v Ekspert
27. marts 2003 - 15:10 #15
Mystisk.

        Purify p = new Purify("abc,def,x&y&z");
        System.out.println(p.getTransformed());

giver " abc def *" hos mig.


Var det ikke det den skulle ?
Avatar billede Slettet bruger
27. marts 2003 - 15:13 #16
jo, det var. Lige den der giver "* * * def * " hos mig...

Denne her "1½ time og max. 2 timer, fra kl. 13:00 mandag" giver "* * * * * * ".

Jeg forstår ingenting....
Avatar billede arne_v Ekspert
27. marts 2003 - 15:17 #17
Hvis du ville have " abc def x*y*z" ud så skal du bruge:

    public String getTransformed() {
        tokenizer = new StringTokenizer(text, "\n,.!?");
        StringBuffer sb = new StringBuffer();

        while (tokenizer.hasMoreTokens()) {
            sb.append(" ");
            StringBuffer t = new StringBuffer(tokenizer.nextToken());
            for (int i = 0; i < t.length(); i++) {
                if (!Character.isLetter(t.charAt(i))) {
                    t.setCharAt(i, '*');
                }
            }
            sb.append(t);
        }
Avatar billede arne_v Ekspert
27. marts 2003 - 15:20 #18
Ah.

Prøv lige og sæt mellemrum ind i separator listen:

tokenizer = new StringTokenizer(text, "\n,.!? "); // mellemrum til sidst
Avatar billede =maddog= Nybegynder
27. marts 2003 - 15:21 #19
Det virker også for mig. Jeg har endda lavet det om til statiske metoder med private konstruktor (pr. intuition - jeg kender ikke lige StringHolder og hvilke krav dette interface stiller)
Avatar billede Slettet bruger
27. marts 2003 - 15:23 #20
Arhhh... Den skulle selvfølgelig have besked på at gå videre også når den mødte en mellemrum...

Tusind tusind tak!

Ikke nok med at jeg har fået det løst - jeg tror også at jeg faktisk fatter det :-)

Tine
Avatar billede =maddog= Nybegynder
27. marts 2003 - 15:27 #21
lige en detalje (nu hvor den store femøre er faldet). Jeg ville bruge
    private final static char seperator = System.getProperty("file.separator").charAt(0)
i stedet så jeg fik den platforms-uafhængige fil separator.
Avatar billede Slettet bruger
27. marts 2003 - 15:29 #22
okay, det fattede jeg så ikke en meter af! :-)
Avatar billede =maddog= Nybegynder
27. marts 2003 - 15:33 #23
System indeholder et Properties objekt med en masse platforms og versions oplysninger. En anden lille detalje ville være at stoppe for løkken når vi har fundet et forkert tegn (så behøves vi nemlig ikke mere information)
for(int i = 0; (i < t.length())&&!realword; i++) {
vil spare en masse regnekraft ved f.x.
e%ewefwefwfeGAGAeghzjnnz
Avatar billede =maddog= Nybegynder
27. marts 2003 - 15:35 #24
for(int i = 0; (i < t.length())&&realword; i++) {
selvfølgelig. lidt for hurtig der. sorry.
Avatar billede Slettet bruger
27. marts 2003 - 15:38 #25
Det fatter jeg sikker om et par lektioner :-) - lige nu er det helt sort!! Skidtet virker, og det er ligesom det vigtigste.

men tak, anyway...

Tine
Avatar billede =maddog= Nybegynder
27. marts 2003 - 15:47 #26
MHT Properties er det lige ud af landevejen. Det er bare parvise Strings der (i dette tilfælde) beskriver systemet. Prøv evt. at lave denne main metode hvis du er blevet nysgerrig:
    public static void main(String args[]) throws Exception{
      System.getProperties().list(System.out);
      System.out.println(System.getProperty("java.version"));
    }
MHT til at stoppe for løkken er det blot sund logik. Det lærer man ikke i en specifik lektion, men ved at tage nok af dem (det kommer efterhånden).
Avatar billede arne_v Ekspert
27. marts 2003 - 16:12 #27
maddog>

Til optimering var det nok nemmere/tydeligere at lave:

          for(int i = 0; i < t.length(); i++){
            if(!Character.isLetter(t.charAt(i))) {
                    realword = false;
                    break;
                }
            }
Avatar billede arne_v Ekspert
27. marts 2003 - 16:13 #28
Og jeg forstår ikke hvor file separator kommer ind i billedet ????
Avatar billede =maddog= Nybegynder
27. marts 2003 - 16:24 #29
smag og behag. det er tydeligere og mere intuitivt, men et eller andet sted i min grundbog står der at man skal begrænse brugen af break i Java kode. Jeg har endnu ikke fundet ud af hvorfor og prøver langsomt at vende mig til at bruge break når det er lettere, men vaner dør langsomt.
Jeg bemærkede blot at hun havde et field kaldet sep med en separator char.
Avatar billede arne_v Ekspert
27. marts 2003 - 16:28 #30
Nå. Det er tekst parsning. Se f.eks. eksemplet: "1½ time og max. 2 timer, fra kl. 13:00 mandag".
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