|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.)
| |
|
|