26. marts 2002 - 14:44Der 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
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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; } }
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
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.
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, 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...!
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.