/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Tokenizer ?
Fra : Esben Nielsen


Dato : 18-12-02 10:34

Hejsa !!!

Jeg sidder her og er lige løbet ind i et lille programmerings problem.

Jeg skal generere nogle navne-initialer, som bliver indlæst fra en
sekventiel fil, således at fx. navnet "Peter Jørgensen" kommer til at hedde
"PJ" eller Pejø".

Det var derfor min umildbare tanke at bruge en tokenizer, men denne funktion
kan jeg vel kun udtage hele navnet frem til mellemrum, så det bliver delt op
i henholdsvis "Peter" og "Jørgensen".....eller hur ????

Hvis ikke det er en tokenizer der skal bruges, hvad skulle det så være der
kan pille et enkelt bogstav ud ???

Mvh.
Esben



 
 
Lars Dam (18-12-2002)
Kommentar
Fra : Lars Dam


Dato : 18-12-02 15:15

On Wed, 18 Dec 2002 10:34:09 +0100
"Esben Nielsen" <ern@mail.dk> wrote:

> Hejsa !!!
>
> Jeg sidder her og er lige løbet ind i et lille programmerings problem.
>
> Jeg skal generere nogle navne-initialer, som bliver indlæst fra en
> sekventiel fil, således at fx. navnet "Peter Jørgensen" kommer til at hedde
> "PJ" eller Pejø".
>
> Det var derfor min umildbare tanke at bruge en tokenizer, men denne funktion
> kan jeg vel kun udtage hele navnet frem til mellemrum, så det bliver delt op
> i henholdsvis "Peter" og "Jørgensen".....eller hur ????
>
> Hvis ikke det er en tokenizer der skal bruges, hvad skulle det så være der
> kan pille et enkelt bogstav ud ???

Jeg ved ikke om nedenstående kan inspirer. Det er en stump kode som tager et sæt strenge og forkorter dem, så forkortelserne er unikke inden for et sæt. Forklaring følger ikke...


/**
* Abbreviates the property keys uniquely within the property list, storing the
* abbreviated keys in the values.<br>
*
* Example:<br>
* <code><br>
* input:<br>
* Hello World =<br>
* Hello Wienerdog=<br>
* Howdy Partener=<br>
* Goodbye Cruel World =<br>
* output:<br>
* Hello World = HW<br>
* Hello Wienerdog=HWi<br>
* Howdy Partener=HP<br>
* Goodbye Cruel World = GCW<br>
* </code><br><br>
*
* @param propNames a property object containing the names to be abbreviated
*/
public void abbreviateNames(Properties propNames) {
if (propNames == null) return;

// first abbreviate names as good as possible
Enumeration e = propNames.propertyNames();
while (e.hasMoreElements()) {
String sName = (String)e.nextElement();
StringBuffer sAbbreviatedName = new StringBuffer(sName.substring(0, 1));
for (int i = 1; i < sName.length(); i++) {
char c = sName.charAt(i);
if ((c >= '0' && c <= '9') || sName.charAt(i - 1) == ' ' || sName.charAt(i - 1) == '-') {
sAbbreviatedName.append(c);
}
}
propNames.put(sName, sAbbreviatedName.toString());
}

// check dupes
e = propNames.propertyNames();
while (e.hasMoreElements()) {
String s = (String)e.nextElement();
String sa = propNames.getProperty(s);
Properties propSame = new Properties();
propSame.put(s, "");
int nCount = 1;
Enumeration e2 = propNames.propertyNames();
while (e2.hasMoreElements()) {
String s2 = (String)e2.nextElement();
String sa2 = propNames.getProperty(s2);
if (!s.equals(s2) && sa.equals(sa2)) {
propSame.put(s2, "");
nCount++;
}
}

// some dupes has been found, make them unique
if (nCount > 1) {
StringBuffer sbFrom[] = new StringBuffer[nCount];
nCount = 0;
e2 = propSame.propertyNames();
while (e2.hasMoreElements()) {
sbFrom[nCount++] = new StringBuffer((String)e2.nextElement());
}
// now shorten them
int nCharPos = 0;
int nInsertPos = 0;
int nDiffCount = 0;
boolean bAbort = false;
while (nDiffCount != nCount - 1 && !bAbort) {
nCharPos++;
nDiffCount = 0;
for (int i = 0; i < nCount - 1; i++) {
boolean bAllSame = true;
for (int j = i + 1; j < nCount; j++) {
if (sbFrom[i].length() > nCharPos && sbFrom[j].length() > nCharPos) {
if (sbFrom[i].charAt(nCharPos) != sbFrom[j].charAt(nCharPos)) {
bAllSame = false;
}
} else {
bAbort = true;
}
}
if (!bAllSame) nDiffCount++;
}
}
// insert diffchar OR id!
e2 = propSame.propertyNames();
int nDiffNumber = 1;
while (e2.hasMoreElements()) {
String sName = (String)e2.nextElement();
StringBuffer sAbbreviatedName = null;
if (bAbort) {
sAbbreviatedName = new StringBuffer((String)propNames.getProperty(sName));
sAbbreviatedName.append(String.valueOf(nDiffNumber++));
} else {
sAbbreviatedName = new StringBuffer(sName.substring(0, 1));
for (int i = 1; i < sName.length(); i++) {
char c = sName.charAt(i);
if ((c >= '0' && c <= '9') || sName.charAt(i - 1) == ' ' || sName.charAt(i - 1) == '-' || i == nCharPos) {
sAbbreviatedName.append(c);
}
}
}
propNames.put(sName, sAbbreviatedName.toString());
}
}
}
}


> Mvh.
> Esben
>

vh. ld

Niels Andersen (18-12-2002)
Kommentar
Fra : Niels Andersen


Dato : 18-12-02 16:26

Esben Nielsen wrote in <3e00427e$0$158$edfadb0f@dread16.news.tele.dk>:
> Jeg skal generere nogle navne-initialer, som bliver indlæst fra en
> sekventiel fil, således at fx. navnet "Peter Jørgensen" kommer til at
> hedde "PJ" eller Pejø".
>
> Det var derfor min umildbare tanke at bruge en tokenizer, men denne
> funktion kan jeg vel kun udtage hele navnet frem til mellemrum, så det
> bliver delt op i henholdsvis "Peter" og "Jørgensen".....eller hur ????

Jeg er java-newbie, men dette virker for mig:

$ cat > test.java << EOF
import java.io.*;
import java.util.*;
import java.lang.*;
class test {
public static void main(String[] args) {
StringTokenizer st = new StringTokenizer(args[0], " ");
StringBuffer initialer = new StringBuffer("");
while (st.hasMoreTokens()) {
initialer.append(st.nextToken().substring(0,1));
}
System.out.println(initialer.toString());
}
}
EOF
$ javac test.java
$ java test "Niels Andersen"
NA
$ _

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Esben Nielsen (18-12-2002)
Kommentar
Fra : Esben Nielsen


Dato : 18-12-02 23:27

Mange tak...jeg fik løst problemet (og reddet dagen)

det var "xxxx.substring (0,2)" der løste gåden....

Nu virker det bare perfekt !!!

Mvh.
Esben




"Niels Andersen" <niels-usenet@myplace.dk> skrev i en meddelelse
news:Yr0M9.5977$Hl6.502438@news010.worldonline.dk...
> Esben Nielsen wrote in <3e00427e$0$158$edfadb0f@dread16.news.tele.dk>:
> > Jeg skal generere nogle navne-initialer, som bliver indlæst fra en
> > sekventiel fil, således at fx. navnet "Peter Jørgensen" kommer til at
> > hedde "PJ" eller Pejø".
> >
> > Det var derfor min umildbare tanke at bruge en tokenizer, men denne
> > funktion kan jeg vel kun udtage hele navnet frem til mellemrum, så det
> > bliver delt op i henholdsvis "Peter" og "Jørgensen".....eller hur ????
>
> Jeg er java-newbie, men dette virker for mig:
>
> $ cat > test.java << EOF
> import java.io.*;
> import java.util.*;
> import java.lang.*;
> class test {
> public static void main(String[] args) {
> StringTokenizer st = new StringTokenizer(args[0], " ");
> StringBuffer initialer = new StringBuffer("");
> while (st.hasMoreTokens()) {
> initialer.append(st.nextToken().substring(0,1));
> }
> System.out.println(initialer.toString());
> }
> }
> EOF
> $ javac test.java
> $ java test "Niels Andersen"
> NA
> $ _
>
> --
> Mvh.
>
> Niels Andersen
> (la nels. anersyn.)



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408905
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste