/ 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
Strenge og tal
Fra : Per Rønne


Dato : 16-11-03 21:20

Findes der en funktionalitet i Java, hvorved man kan få omformet en
streng s1 af længde l1 til en streng s2 af længden l2 > l1? På en sådan
måde at s1 bliver højrestillet i s2.

Skal bruges i forbindelse med udskrivning af tal i kolonner.
--
Per Erik Rønne

 
 
Mikkel Bundgaard (16-11-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 16-11-03 21:46

On Sun, 16 Nov 2003 21:19:35 +0100, Per Rønne wrote:

> Findes der en funktionalitet i Java, hvorved man kan få omformet en
> streng s1 af længde l1 til en streng s2 af længden l2 > l1? På en sådan
> måde at s1 bliver højrestillet i s2.
Ikke så vidt jeg ved. Det er dog lang tid siden, at jeg har programmeret i
Java, så det kan godt være, at du kan finde hjælp i apien
http://java.sun.com/j2se/1.4.2/docs/api/java/text/NumberFormat.html
eller
http://java.sun.com/j2se/1.4.2/docs/api/java/text/Format.html

Ellers burde nedenstående kunne tilføje X antal mellemrum foran en tekst
(uden fejlhåndtering og kun testet på to strenge).
public static String addSpaces(String arg, int num) {
// if num < 0 then raise error
char[] res = new char[arg.length() + num];
System.arraycopy(arg.toCharArray(), 0, res, num, arg.length());
java.util.Arrays.fill(res, 0, num, ' ');
return String.valueOf(res);
}
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum

Per Rønne (17-11-2003)
Kommentar
Fra : Per Rønne


Dato : 17-11-03 07:37

Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:

> On Sun, 16 Nov 2003 21:19:35 +0100, Per Rønne wrote:
>
> > Findes der en funktionalitet i Java, hvorved man kan få omformet en
> > streng s1 af længde l1 til en streng s2 af længden l2 > l1? På en sådan
> > måde at s1 bliver højrestillet i s2.
> Ikke så vidt jeg ved. Det er dog lang tid siden, at jeg har programmeret i
> Java, så det kan godt være, at du kan finde hjælp i apien
> http://java.sun.com/j2se/1.4.2/docs/api/java/text/NumberFormat.html
> eller
> http://java.sun.com/j2se/1.4.2/docs/api/java/text/Format.html
>
> Ellers burde nedenstående kunne tilføje X antal mellemrum foran en tekst
> (uden fejlhåndtering og kun testet på to strenge).
> public static String addSpaces(String arg, int num) {
> // if num < 0 then raise error
> char[] res = new char[arg.length() + num];
> System.arraycopy(arg.toCharArray(), 0, res, num, arg.length());
> java.util.Arrays.fill(res, 0, num, ' ');
> return String.valueOf(res);
> }

Tak for hjælpen, især da jeg ser du bruger funktionaliteter der ikke
omtales i den litteratur jeg er i besiddelse af.

Det fungerer nu som:

public static String addSpaces (String arg, int num){
// if num < 0 then raise error
char[] res = new char[arg.length() + num];
System.arraycopy(arg.toCharArray(),0,res,num, arg.length());
java.util.Arrays.fill (res,0,num,' ');
return String.valueOf(res);
}
public static String round(double d, int i){
double t = Math.round(d);
String s1=""+t;
int j = (i>=s1.length())? i - s1.length(): s1.length();
String s2=addSpaces(s1,j);
return s2;
};
--
Per Erik Rønne

Kurt Kjær Jensen (17-11-2003)
Kommentar
Fra : Kurt Kjær Jensen


Dato : 17-11-03 19:49

Per Rønne wrote:

> Det fungerer nu som:
>
> public static String addSpaces (String arg, int num){
> // if num < 0 then raise error
> char[] res = new char[arg.length() + num];
> System.arraycopy(arg.toCharArray(),0,res,num, arg.length());
> java.util.Arrays.fill (res,0,num,' ');
> return String.valueOf(res);
> }

Der er også den ultra-korte, som godtnok ikke er sikret mod grimme
index-fejl o.l. Bemærk at length har en lidt anden betydning en num i
ovenstående...

private static String addSpaces (String s, int length)
{
return " ".substring(0, length - s.length()) + s;
}


--
Vh Kurt http://www.aub.dk/~kkjen


Mikkel Bundgaard (17-11-2003)
Kommentar
Fra : Mikkel Bundgaard


Dato : 17-11-03 23:25

On Mon, 17 Nov 2003 07:36:57 +0100, Per Rønne wrote:

> Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:
>
>> On Sun, 16 Nov 2003 21:19:35 +0100, Per Rønne wrote:
>>
>> > Findes der en funktionalitet i Java, hvorved man kan få omformet en
>> > streng s1 af længde l1 til en streng s2 af længden l2 > l1? På en sådan
>> > måde at s1 bliver højrestillet i s2.
<SNIP>
> Tak for hjælpen, især da jeg ser du bruger funktionaliteter der ikke
> omtales i den litteratur jeg er i besiddelse af.
Det hele står i apien, som jeg altid kigger i, da jeg ikke roder så ofte
med java mere (så er det svært at huske alle metoderne ).

> Det fungerer nu som:
>
> public static String addSpaces (String arg, int num){
> // if num < 0 then raise error
> char[] res = new char[arg.length() + num];
> System.arraycopy(arg.toCharArray(),0,res,num, arg.length());
> java.util.Arrays.fill (res,0,num,' ');
> return String.valueOf(res);
> }
> public static String round(double d, int i){
> double t = Math.round(d);
> String s1=""+t;
> int j = (i>=s1.length())? i - s1.length(): s1.length();
Er der ikke en fejl i ovenstående linje ????
Hvis længden af s1 er større end i, så sætte du længden af s1 foran. Så
vidt jeg forstod dit oprindelige spørgsmål skulle linjen være:
int j = (i>=s1.length())? i - s1.length(): 0;
> String s2=addSpaces(s1,j);
> return s2;
> };
Lige en lille side kommentar til String s1=""+t; som jeg ikke bryder mig
så meget om . Udover det ligner et hack, så generer den også ineffektiv
bytekode, selvom det ikke betyder så meget, hvis funktionen kun kaldes et
par gange. To eksempler:

public static String test1(double d){
String s1=""+d;
return s1;
};

public static String test2(double d){
String s1=String.valueOf(d);
return s1;
};

Giver følgende bytekode:
Method java.lang.String test1(double)
0 new #6 <Class java.lang.StringBuffer>
3 dup
4 invokespecial #7 <Method java.lang.StringBuffer()>
7 ldc #13 <String "">
9 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)>
12 dload_0
13 invokevirtual #14 <Method java.lang.StringBuffer append(double)>
16 invokevirtual #12 <Method java.lang.String toString()>
19 astore_2
20 aload_2
21 areturn

Method java.lang.String test2(double)
0 dload_0
1 invokestatic #15 <Method java.lang.String valueOf(double)>
4 astore_2
5 aload_2
6 areturn

Som det måske kan læses af bytekoden, så opretter test1 et StringBuffer
objekt, som den appender "" til, hvorefter den appender d til resultatet,
for til sidst at kalde toString på StringBufferen.
--
Mikkel Bundgaard
Student at IT University of Copenhagen
Codito, Ergo Sum

Per Rønne (20-11-2003)
Kommentar
Fra : Per Rønne


Dato : 20-11-03 08:41

Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:

> On Mon, 17 Nov 2003 07:36:57 +0100, Per Rønne wrote:
>
> > Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:
> >
> >> On Sun, 16 Nov 2003 21:19:35 +0100, Per Rønne wrote:
> >>
> >> > Findes der en funktionalitet i Java, hvorved man kan få omformet en
> >> > streng s1 af længde l1 til en streng s2 af længden l2 > l1? På en sådan
> >> > måde at s1 bliver højrestillet i s2.
> <SNIP>
> > Tak for hjælpen, især da jeg ser du bruger funktionaliteter der ikke
> > omtales i den litteratur jeg er i besiddelse af.
> Det hele står i apien, som jeg altid kigger i, da jeg ikke roder så ofte
> med java mere (så er det svært at huske alle metoderne ).
>
> > Det fungerer nu som:
> >
> > public static String addSpaces (String arg, int num){
> > // if num < 0 then raise error
> > char[] res = new char[arg.length() + num];
> > System.arraycopy(arg.toCharArray(),0,res,num, arg.length());
> > java.util.Arrays.fill (res,0,num,' ');
> > return String.valueOf(res);
> > }
> > public static String round(double d, int i){
> > double t = Math.round(d);
> > String s1=""+t;
> > int j = (i>=s1.length())? i - s1.length(): s1.length();
> Er der ikke en fejl i ovenstående linje ????
> Hvis længden af s1 er større end i, så sætte du længden af s1 foran. Så
> vidt jeg forstod dit oprindelige spørgsmål skulle linjen være:
> int j = (i>=s1.length())? i - s1.length(): 0;

Du har ret.

> > String s2=addSpaces(s1,j);
> > return s2;
> > };

> Lige en lille side kommentar til String s1=""+t; som jeg ikke bryder mig
> så meget om . Udover det ligner et hack, så generer den også ineffektiv
> bytekode, selvom det ikke betyder så meget, hvis funktionen kun kaldes et
> par gange.

Jeg bruger Java [med Eclipse] til at undervise htx-elever i faget
Programmering, der er på C-nivaeu. Jeg har ikke tidligere arbejdet med
Java, og har kun Rogers Cadenheads »Java 2 bogen« og en af mig
downloadet pdf-bog »Linux -friheden til at programmere i Java«. Eleverne
har også den pågældende Java-bog, ligesom pdf-bogen er fotokopieret til
dem. Ingen af dem synes at indeholde fulde beskrivelser af metoder til
standardklasserne, og String.valueOf nævnes i hvert fald ikke.

Funktionerne skal benyttes som på samme måde som det der kendes fra
Pascal ved udskrivning af integers og reals:

program att (input, output);
var i: integer; r: real;
begin
...
writeln(output,'i: ',i:7,' r: ', r:10:2);
...
end.

Jeg har også et gymnasiehold i datalogi, og her benyttes Delphi, og i
øvrigt de to bøger som kan ses omtalt på:

www.tolstrupdata.dk

- samt i øvrigt en gammel Pascal-bog fra Borgen Data:
»Pascal-programmering« af Beck, Monrad og Salomon. Alle beregnet for
gymnasieskolen. Pascal-udgaven er i øvrigt objektorienteret.

Det er mine erfaringer at selv om Pascal er forældet, så er det stadig
lettere for begyndere at lære. Samtidig viser al erfaring at det
sværeste at lære er det første sprog; derefter skal der grundlæggende
ikke så meget læres nye /begreber/, men derimod /hvordan man gør
dit-og-dat i det nye sprog/.

Derudover findes der gode skolebøger på dansk, beregnet på
gymnasienivaeuet, til Pascal/Delphi. Jeg har ikke kendskab til noget
tilsvarende for Javas vedkommende.

Jeg kan tilføje at hvad der volder problemer er det dynamiske i
tildelingssætninger (!) og løkker. Og prøv så lige at sammenligne
følgende sprog:

for (i=1;i<=10;i++){
...
}

med:

for i:= 1 to 10 do begin
...
end

> To eksempler:
>
> public static String test1(double d){
> String s1=""+d;
> return s1;
> };
>
> public static String test2(double d){
> String s1=String.valueOf(d);
> return s1;
> };
>
> Giver følgende bytekode:
> Method java.lang.String test1(double)
> 0 new #6 <Class java.lang.StringBuffer>
> 3 dup
> 4 invokespecial #7 <Method java.lang.StringBuffer()>
> 7 ldc #13 <String "">
> 9 invokevirtual #11 <Method java.lang.StringBuffer append(java.lang.String)
> 12 dload_0
> 13 invokevirtual #14 <Method java.lang.StringBuffer append(double)>
> 16 invokevirtual #12 <Method java.lang.String toString()>
> 19 astore_2
> 20 aload_2
> 21 areturn
>
> Method java.lang.String test2(double)
> 0 dload_0
> 1 invokestatic #15 <Method java.lang.String valueOf(double)>
> 4 astore_2
> 5 aload_2
> 6 areturn
>
> Som det måske kan læses af bytekoden, så opretter test1 et StringBuffer
> objekt, som den appender "" til, hvorefter den appender d til resultatet,
> for til sidst at kalde toString på StringBufferen.

Og nu ser de to rutiner altså således ud:

public class StringKlasse {
private static String addSpaces (String arg, int num){
// if num < 0 then raise error
char[] res = new char[arg.length() + num];
System.arraycopy(arg.toCharArray(),0,res,num, arg.length());
java.util.Arrays.fill (res,0,num,' ');
return String.valueOf(res);
}
public static String round(double d, int i){
String s1= String.valueOf(Math.round(d));
int j = (i>=s1.length())? i - s1.length(): 0;
return addSpaces(s1,j);
};
}
--
Per Erik Rønne

Christian Bohr-Halli~ (20-11-2003)
Kommentar
Fra : Christian Bohr-Halli~


Dato : 20-11-03 15:59

doesnt.work@spam.filter.invalid (Per Rønne) posting:

>Java, og har kun Rogers Cadenheads »Java 2 bogen« og en af mig

Det var da også, IMO, en usandsynlig dårlig bog at starte med.

>lettere for begyndere at lære. Samtidig viser al erfaring at det
>sværeste at lære er det første sprog; derefter skal der grundlæggende
>ikke så meget læres nye /begreber/, men derimod /hvordan man gør
>dit-og-dat i det nye sprog/.

Også på tværs af paradigmer?

--
What is life, except excuse for death,
or death, but an escape from life.
--Unknown

Per Rønne (20-11-2003)
Kommentar
Fra : Per Rønne


Dato : 20-11-03 18:33

Christian Bohr-Halling <nospam@direkte.org> wrote:

> doesnt.work@spam.filter.invalid (Per Rønne) posting:
>
> >Java, og har kun Rogers Cadenheads »Java 2 bogen« og en af mig
>
> Det var da også, IMO, en usandsynlig dårlig bog at starte med.

Jeps. Men det var den bog skolen havde.

> >lettere for begyndere at lære. Samtidig viser al erfaring at det
> >sværeste at lære er det første sprog; derefter skal der grundlæggende
> >ikke så meget læres nye /begreber/, men derimod /hvordan man gør
> >dit-og-dat i det nye sprog/.

> Også på tværs af paradigmer?

Hvad mener du dog? Pascal som det findes i Delphi er faktisk også
objektorienteret. Og eleverne får nogle mere mere menneskelige
sætninger, som det kan ses i forskellen mellem:

for i:= 1 to 10 do

for (i=1;i<=10;i++)

Læg mærke til at jeg ikke argumenterer for Pascal som et /professionelt/
sprog. Her ville jeg bruge C++ eller lignende, og med et passende IDE og
klassebibliotek.
--
Per Erik Rønne

Christian Bohr-Halli~ (21-11-2003)
Kommentar
Fra : Christian Bohr-Halli~


Dato : 21-11-03 01:58

doesnt.work@spam.filter.invalid (Per Rønne) posting:

> >lettere for begyndere at lære. Samtidig viser al erfaring at det
>> >sværeste at lære er det første sprog; derefter skal der grundlæggende
>> >ikke så meget læres nye /begreber/, men derimod /hvordan man gør
>> >dit-og-dat i det nye sprog/.
>> Også på tværs af paradigmer?
>Hvad mener du dog?

Det er muligt, at du lettere kan lære C[1], BASIC[1], Algol[1] osv,
hvis du allerede kan Pascal[1]. Men kan du også lettere lære
Prolog[2] og Haskell[3], hvis du allerede kan Pascal[1]?


[1] Sprog inden for det imperative paradigme
[2] Sprog inden for det logikori. paradigme
[3] Sprog inden for det funktionsori. paradige

--
What is life, except excuse for death,
or death, but an escape from life.
--Unknown

Per Rønne (21-11-2003)
Kommentar
Fra : Per Rønne


Dato : 21-11-03 06:07

Christian Bohr-Halling <nospam@direkte.org> wrote:

> doesnt.work@spam.filter.invalid (Per Rønne) posting:

> > >lettere for begyndere at lære. Samtidig viser al erfaring at det
> >> >sværeste at lære er det første sprog; derefter skal der grundlæggende
> >> >ikke så meget læres nye /begreber/, men derimod /hvordan man gør
> >> >dit-og-dat i det nye sprog/.

> >> Også på tværs af paradigmer?

> >Hvad mener du dog?

> Det er muligt, at du lettere kan lære C[1], BASIC[1], Algol[1] osv,
> hvis du allerede kan Pascal[1]. Men kan du også lettere lære
> Prolog[2] og Haskell[3], hvis du allerede kan Pascal[1]?

Det er muligt at du har ret i det. Jeg har dog ingen erfaring med det,
og personligt har jeg nok lært dem i rækkefølgen: Pascal, andre
imperative sprog, lambda-kalkule, LISP, Prolog. Sådan var det på
Datalogisk Institut ved Københavns Universitet da jeg gik der [kandidat
1992].

> [1] Sprog inden for det imperative paradigme
> [2] Sprog inden for det logikori. paradigme
> [3] Sprog inden for det funktionsori. paradige

Men aktuelt taler vi om hvad skoleelever på det gymnasiale niveau skal
lære i fagene datalogi [alment gymnasium og hf] og programmering [htx].
--
Per Erik Rønne

Peter Lind (20-11-2003)
Kommentar
Fra : Peter Lind


Dato : 20-11-03 23:41

Per Rønne wrote:
> Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:
>> On Mon, 17 Nov 2003 07:36:57 +0100, Per Rønne wrote:
>>> Mikkel Bundgaard <doesnt.work@spam.filter.invalid> wrote:
>>>> On Sun, 16 Nov 2003 21:19:35 +0100, Per Rønne wrote:
>>>>
>>> Tak for hjælpen, især da jeg ser du bruger funktionaliteter der ikke
>>> omtales i den litteratur jeg er i besiddelse af.
>> Det hele står i apien, som jeg altid kigger i, da jeg ikke roder så
>> ofte med java mere (så er det svært at huske alle metoderne ).
>
> Jeg bruger Java [med Eclipse] til at undervise htx-elever i faget
> Programmering, der er på C-nivaeu. Jeg har ikke tidligere arbejdet med
> Java, og har kun Rogers Cadenheads »Java 2 bogen« og en af mig
> downloadet pdf-bog »Linux -friheden til at programmere i Java«.
> Eleverne har også den pågældende Java-bog, ligesom pdf-bogen er
fotokopieret
> til dem. Ingen af dem synes at indeholde fulde beskrivelser af metoder til
> standardklasserne, og String.valueOf nævnes i hvert fald ikke.

Nej, men netop derfor er det vigtigt at de (og du) lærer at slå op i APIen.
Uanset hvilket sprog man arbejder med, så er man nødt til at lære en masse
mystiske APIkald at kende.
APIen findes iøvrigt på http://java.sun.com/j2se/1.4.2/docs/api/index.html
og kan downloades (sammen med en masse andet) fra
http://java.sun.com/docs/ - der er også den ganske udmærkede tutorial, som
eleverne (når de først har lært sprogets mekanismer) vil få stor glæde af at
lære at navigere i.

> Funktionerne skal benyttes som på samme måde som det der kendes fra
> Pascal ved udskrivning af integers og reals:

> writeln(output,'i: ',i:7,' r: ', r:10:2);

Nu er det vildt længe siden jeg har benyttet Pascal, men man kan jo i Java
skrive:

System.out.println("i: " + i + " r: " + r );

Ønsker man en formatteret udskrift skal der dog lidt mere til - man kan
bruge en formatter som f.eks. DecimalFormat, der selvfølgelig er voldsom
avanceret, og kræver en smule tilvænning, før man tør bruge den.

> Det er mine erfaringer at selv om Pascal er forældet, så er det stadig
> lettere for begyndere at lære. Samtidig viser al erfaring at det
> sværeste at lære er det første sprog; derefter skal der grundlæggende
> ikke så meget læres nye /begreber/, men derimod /hvordan man gør
> dit-og-dat i det nye sprog/.

Jeg vil give dig fuldstændig ret. Jeg lærte Basic som det første sprog,
derefter maskinkode/assembler, og først senere Pascal, der hurtigt afløstes
af C. Dertil er kommet Ada, Java og nogle andre mere specielle sprog.
Men jeg mener helt klart at Pascal er et af de 'pæneste' sprog, med en
grammatik der ligger meget tæt på almindelig engelsk. C++ er nok det
grimmeste sprog, med et væld af kryptiske tegn og symboler, og Java ligger
et sted imellem.

> Derudover findes der gode skolebøger på dansk, beregnet på
> gymnasienivaeuet, til Pascal/Delphi. Jeg har ikke kendskab til noget
> tilsvarende for Javas vedkommende.

Det har jeg faktisk heller ikke - eller, jeg ved at der er
http://javabog.dk/ , men jeg ved ikke hvor god den er. (sikkert bedre end
Linux-tingen, den slags har det med at have en form for religiøs undertone,
som ikke falder i alles smag).

> Jeg kan tilføje at hvad der volder problemer er det dynamiske i
> tildelingssætninger (!) og løkker. Og prøv så lige at sammenligne
> følgende sprog:
>
> for (i=1;i<=10;i++){
> ...
> }
>
> med:
>
> for i:= 1 to 10 do begin
> ...
> end

Det er min (lille) erfaring at nybegyndere har lidt nemmere ved at forstå en
while-løkke, end en for-løkke.

i = 1;
while( i <= 10 )
{
...

i++;
}

Men jeg ved ikke om det gælder alle. Jeg kan tilføje at jeg selv ofte laver
fejl i for-løkke-konstruktion, stadig nu efter mere end 10 års
programmeringserfaring.

--
Mvh
Peter Lind



Jonas Kongslund (21-11-2003)
Kommentar
Fra : Jonas Kongslund


Dato : 21-11-03 01:29

Peter Lind wrote:

> Det har jeg faktisk heller ikke - eller, jeg ved at der er
> http://javabog.dk/ , men jeg ved ikke hvor god den er. (sikkert bedre end
> Linux-tingen, den slags har det med at have en form for religiøs
> undertone, som ikke falder i alles smag).

Jeg kan afsløre at store dele af javabog.dk er indeholdt i "Linux-tingen".

--
Jonas Kongslund

Jesper Matthiesen (17-11-2003)
Kommentar
Fra : Jesper Matthiesen


Dato : 17-11-03 11:51


"Per Rønne" <doesnt.work@spam.filter.invalid> wrote in message
news:1g4jc97.1m2hkq582v46qN%doesnt.work@spam.filter.invalid...
> Findes der en funktionalitet i Java, hvorved man kan få omformet en
> streng s1 af længde l1 til en streng s2 af længden l2 > l1? På en sådan
> måde at s1 bliver højrestillet i s2.
>
> Skal bruges i forbindelse med udskrivning af tal i kolonner.

Hvis det kun er til udskrivning kan du jo bare sige

for(x < antal tegn der mangler)
System.out.print(" ");

Mvh Jesper

> --
> Per Erik Rønne



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

Månedens bedste
Årets bedste
Sidste års bedste