Avatar billede kasseper Nybegynder
26. marts 2002 - 14:44 Der er 13 kommentarer og
2 løsninger

StringTokenizer bøvl....Streng delimiter...

Hej Jeg har sq et mindre problem.

Jeg har en laaaaaaang streng der indeholder data, repræsenterende en fler niveau datastruktur. Altså har jeg delimitere i strengen. Problemet er bare at de er strenge der er længere en 1.
Jeg tænkte selvfølgelig at jeg bruger bare StringTokenizer :

new StringTokenizer("test1|1|child1;2;nummer1,nummer2§LEV2§child1;2;nummer3,nummer4§LEV1§test2§LEV1§test3","§LEV1§");

Men den deler ikke kun ved "§LEV1§", men hver gang der står enten §,L,E,V,1 eller §. ER det ikke muligt at dele udfra en streng...?

Til orintering kan jeg sige at de tokens jeg får ud er (en pr. linie...) :



test
|
|child
;2;nummer
,nummer2
2
child
;2;nummer3,nummer4
test2


Hvilket er helt hen i hampen jeg skulle ha haft :

test1|1|child1;2;nummer1,nummer2§LEV2§child1;2;nummer3,nummer4
test2
test3
Avatar billede kasseper Nybegynder
26. marts 2002 - 14:46 #1
sorry... jeg får selvfølgelig test3 med i fejloutputtet også.:)
Avatar billede jakoba Nybegynder
26. marts 2002 - 15:05 #2
hvis alt hvad du skal bruge er en opdeling ved hver forekomst af en given streng er den da ret nem at lave selv:

String[] delPar1VedPar2( String langStreng, String deleStreng ) {
    String[] res = new String[];
    resIdx = 0;
    strIdx = 0;
    while ( ( str2Idx = langStreng.indexOf( deleStreng, resIdx ) ) >= 0 ) {
        res[resIdx++] = langStreng.substring( strIdx, str2Idx );
        resIdx += deleStreng.length();
    }
    res[resIdx++] = langStreng.substrinf( strIdx );
    return res;
} //end delPar1VedPar2.

mvh JakobA
Avatar billede jakoba Nybegynder
26. marts 2002 - 15:07 #3
Ups: linien
        resIdx += deleStreng.length();
skal være
        strIdx = str2Idx + deleStreng.length();

noget af en fejl..
Avatar billede greybeard Nybegynder
27. marts 2002 - 08:38 #4
package util;

import java.lang.*;
import java.util.*;

public class XStringTokenizer {

    private int cp;
    private int tc;
    private int max;
    private int index;
    private String str;
    private String[] tokens;
    private String delimiters;
    private String[] delimiterArray;
//    boolean include;
   
    public XStringTokenizer(String s) {
        this(s," \t\n\r\f",false);
//        System.out.println( "Begin:" );
//        for ( int i = 0 ; i < tc ; i++ ) {
//            System.out.println( tokens[i] );
//        }
//        System.out.println( "End:" );
    }
   
    public XStringTokenizer(String s, String d) {
        this(s,d,false);
//        System.out.println( "Begin:" );
//        for ( int i = 0 ; i < tc ; i++ ) {
//            System.out.println( tokens[i] );
//        }
//        System.out.println( "End:" );
    }
   
    public XStringTokenizer(String s, String d, boolean isToken) {
        str = s;
        delimiters = d;
        index = 0;
        tokenize(isToken);
//        System.out.println( "Begin:" );
//        for ( int i = 0 ; i < tc ; i++ ) {
//            System.out.println( tokens[i] );
//        }
//        System.out.println( "End:" );
    }
   
   
    public XStringTokenizer(String s, String[] d, boolean b) {
        if (!b){
            throw new IllegalArgumentException("Argument false not yet supported");
        }
        if (s == null || s == "" || d == null){
            throw new IllegalArgumentException("null or empty string");
        }
        for ( int i = 0 ; i < d.length ; i++ ) {
            if (d[i] == null || d[i] == ""){
                throw new IllegalArgumentException("null or empty string");
            }
        }
        str = s;
        delimiterArray = d;
//        include = b;
        stringTokenize(b);
    }
   
    private void tokenize( boolean w) {
        cp = 0;
        tc = 0;
        max = str.length() -1;
        while (cp <= max) {
            if (delimiters.indexOf(str.charAt(cp)) != -1) { // is delimiter
                cp++;
                if (w){
                    tc++;
                }
            } else {
                while (cp <= max && delimiters.indexOf(str.charAt(cp)) == -1) {// is not delimiter
                    cp++;
                }
                tc++;
            }
        }
        tokens = new String[tc];
        String temp = "";
        char c;
        cp = 0;
        tc = 0;
        while (cp <= max) {
            c = str.charAt(cp);
//            System.out.println( c + " " + cp + " " + tc);
            if (delimiters.indexOf(c) != -1){
                if (!temp.equals("")){
                    tokens[tc] = temp;
                    tc++;
                    temp = "";
                }
                if (w){
                    tokens[tc] = "" + c;
                    tc++;
                }
                cp++;
            } else {
                temp = temp + c;
//                System.out.println( temp );
                cp++;
            }
        }
        if (!temp.equals("")){
            tokens[tc] = temp;
            tc++;
            temp = "";
        }
        tc = tokens.length;
        cp = 0;
    }
   
    public void stringTokenize(boolean b) {
        ArrayList tok = new ArrayList();
        int index = str.length();
        int tempIndex;
        String sub = str;
        int j = 0;
        boolean cont = true;
       
        while (cont) {
            for ( int i = 0 ; i < delimiterArray.length ; i++ ) {
                tempIndex = sub.indexOf(delimiterArray[i]);
                if (tempIndex != -1){
                    if (tempIndex < index){
                        index = tempIndex;
                        j = i;
                    }
                }
            }// end for
                   
            if (index < sub.length()){
                tok.add(sub.substring(0,index));
                if (b){
                    tok.add(delimiterArray[j]);
                }
               
                index += delimiterArray[j].length();
                sub = sub.substring(index);
                index = sub.length();
            } else {
                if (sub.length() > 0){
                    tok.add(sub);
                }
               
                cont = false;
            }
        }// end while
        tc = tok.size();
        tokens = new String[tc];
        tok.toArray(tokens);
        cp = 0;
    }
   
   
    public boolean hasNext() {
        return( cp < tc );
    }
   
    public boolean hasMoreTokens() {
        return( hasNext() );
    }
       
    public boolean hasPrevious() {
        return( cp > 0 );
    }
   
    public String nextToken() {
        if (cp < tc){
            cp++;
            return( tokens[cp - 1] );
        } else {
            throw new IndexOutOfBoundsException("No more tokens");
        }
    }
   
    public int currentIndex() {
        if (cp > 0 && cp < tc){
            return( cp );
        } else {
            return( -1 );
        }
    }
   
    public String currentToken() {
        if (cp > 0 && cp < tc){
            return( tokens[cp] );
        } else {
            throw new IndexOutOfBoundsException("No current token, try to reset");
        }
    }
    public String previousToken() {
        if (cp > 0){
            cp--;
            return( tokens[cp] );
        } else {
            throw new IndexOutOfBoundsException("No previous tokens");
        }
    }
   
    public int indexOf(String in) {
        index = 0;
        return( nextIndexOf(in) );
    }
   
    public int nextIndexOf(String in) {
        for ( int i = index ; i < tc ; i++ ) {
            if (in.equals(tokens[i])){
                index = i;
                return( i );
            }
        }
        return( -1 );
    }
   
    public int lastIndexOf(String in) {
    for ( int i = tc-1 ; i >= 0 ; i-- ) {
        if (in.equals(tokens[i])){
            index = i;
            return( i );
        }
    }
    return( -1 );
}
   
    public String tokenAt(int in) {
        if (in < tc && in >= 0){
            return( tokens[in] );
        }
        else {
            throw new IndexOutOfBoundsException("Can't return the " + in +"'th token out of 0-" + (tc-1) + " possible");
        }
    }
   
    public int countTokens() {
        return( tc );
    }
   
    public String toString() {
        return( str );
    }
    public void reset() {
        cp = 0;
        index = 0;
    }
}

Denne her skulle klare dit problem.

Det er en alfa version, som ikke er gennemtestet.
Avatar billede kasseper Nybegynder
27. marts 2002 - 10:18 #5
hmmm. greybeard, så tror jeg altså at jakoba's løsning er mere overskuelig.
Men du kan få lidt for svaret...
Så hvis jakoba kunne smide et svar...!
Avatar billede greybeard Nybegynder
27. marts 2002 - 10:24 #6
Det er ikke en specifik løsning på dit problem, men en generel løsning.
Den ene konstruktor tager hovedstrengen som 1. parameter, et String[] med de strenge du vil dele efter som andet parameter, og true som tredje. (False er ikke implementeret endnu.)
Derefter kan du bruge f.eks. hasNext og nextToken til at hente indholdet med.
I modsætning til  StringTokenizer kan du også gå baglæns og bruge indeks
Avatar billede kasseper Nybegynder
27. marts 2002 - 11:01 #7
Jamen det er altsammen meget fint, men det er altså ikke det jeg har bedt om !
Ingen tvivl om at det er brugbart i mit tilfælde og i mange andre. Problemet er vel bare at det bliver for generelt. Da streng operationer er nogle af de mest resource krævende at udføre, så vil en specialiseret være at foretrække.
Avatar billede greybeard Nybegynder
27. marts 2002 - 11:21 #8
Ud fra dit spørgsmål har du forskellige strenge at dele efter.

Og så er det, hvad du bad om.

Hvad angår resourcer, så er da højst et spørgsmål om nogle få bytes ekstra til kode.
De metoder du ikke bruger, bruger da ikke processorkraft.

Om så den ene eller den anden metode gør det bedst, skal jeg ikke kunne sige uden at lave et forsøg.
Avatar billede kasseper Nybegynder
27. marts 2002 - 12:19 #9
Ok, jeg er enig i at jeg måske gav tvetydige krav til løsningen. Jeg skrev at jeg havde flere strenge, men jeg gav også facit på opgaven, altså delt med 1 streng.
Lad nu det ligge, efter at have nærstuderet din kode, kan godt se at du ikke lave særlig meget unødigt i forbindelse med min problematik, så din er absolut brugbar, og du tilbyder metoder til at retrieve uden at gøre mere end som så, derfor er der ikke noget overhead på det. Min fejl, min fejl. Jeg var nok for hurtig til at forkaste da jeg så den mængde kode du havde pastet ind.
(KREITCH-TING :[lyden af et stempel]) Din løsning er godkendt.
Jeg vil nu stadig ikke godt gi jakoba en lille slat, da han jo trods alt var først med en brugbar løsning.....

OK ?
Avatar billede greybeard Nybegynder
27. marts 2002 - 12:21 #10
Fint medd mig:-))
Avatar billede kasseper Nybegynder
27. marts 2002 - 12:24 #11
Ok, så venter vi bare på jakoba.....zzzzz....zzzz.zz.z.z.z.z.z.z.z.zzzz Så længe har han da ikke været om det før.....HAALLLOOOOO JAKOBA der er point i farevandet...!
Avatar billede kasseper Nybegynder
27. marts 2002 - 12:25 #12
Hvad sir du skal vi gi ham til imorgen ???
Avatar billede jakoba Nybegynder
27. marts 2002 - 12:50 #13
jatak :-))
Avatar billede kasseper Nybegynder
27. marts 2002 - 12:56 #14
Jakoba : 30
GreyBeard : 70
Avatar billede greybeard Nybegynder
27. marts 2002 - 15:01 #15
Også tak
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