Sida 1 av 2
Behöver lite java hjälp
Postat: 05 jul 2007, 18:30
av lennart
Tja har lite problem i java. Hoppas någon kan hjälpa.
Mitt problem är att jag vill kunna mata in en valfri sträng i körtid, med ospecificerade antal tokens för att sedan kunna splitta upp strängen och spara de olika tokens till olika variabler.
Är det någon som vet något smart sätt att göra det på???
Lite newbie på java. Tack på förhand.
Lennart
SV: Behöver lite java hjälp
Postat: 05 jul 2007, 18:39
av Okänd
tjena, jag skulle råda dig att skapa en scanner instans:
Kod: Markera allt
Scanner scan = new Scanner(System.in);
// sedan är det bara att scana på
if(scan.hasNextInt()) {
int i = scan.readNextInt();
}
// osv osv...
om du vill dela upp dina variabler i strängen med te.x. : tecken så går det också bra
Kod: Markera allt
String test = "1:2:3:4:5";
Scanner scan = new Scanner(test);
scan.useDelimiter("\\s*:\\s*");
scan.readNextInt();
//osv...
SV: Behöver lite java hjälp
Postat: 05 jul 2007, 19:12
av lennart
Tack för ett snabbt svar, men får det tyvärr inte riktigt att funka som jag vill.
bifogar lite kod här som kanske ger lite mer förklaring.
Kod: Markera allt
Scanner in = new Scanner (System.in);
String s = in.next (); // här tänkte jag skriva in t.ex "kalle olle peter" eller någon sträng med kanske 6 tokens dvs ospecificerat när man kör programmet.
// någon loop med en metod som delar upp antalet token som typ hasNext eller liknande
// här skulle jag vilja ha något magiskt som sparar alla tokens i olika variabler som inte är i förväg kända.
Hoppas att jag inte missförstod din förklaring, men e lite ny på java så hoppas ni har tålamod

SV: Behöver lite java hjälp
Postat: 05 jul 2007, 19:31
av Okänd
nåt i stil med detta?
Kod: Markera allt
Vector<String> v = new Vector<String>();
Scanner in = new Scanner (System.in);
while(in.hasNext())
v.add(in.next());
då lagras all indata i vektorn v...
edit: Jag har inte kompilerat och testat koden, men nåt i den där stilen är kanske vad du letar efter...
SV: Behöver lite java hjälp
Postat: 05 jul 2007, 23:24
av lennart
Det verkar vara rätt väg att gå, men när jag exekverar koden så får jag ingen stop på vektorn, utan man bara fortsätter att skriva in ord till vektorn men man kommer inte vidare i programmet?
Anledningen till att jag vill kunna dela upp tokens är att jag försöker skriva ett filhanterar program (gör detta för att lära mig java) som t.ex kan lista filer eller byta namn på två filer och att jag vill kunna skriva mv fil1 fil2 i prompten i programmet, för att kunna göra det måste jag kunna skriva allt som en sträng men kunna dela upp strängen i tre delar. rm skall gå till en if-sats som gör ett metod anrop med två variabler fil1 och fil2. jag bifogar lite av koden jag skrivit så kanske det blir ännu klarare.
Kod: Markera allt
Scanner in = new Scanner (System.in);
while (true)
{
File kat = new File (".");
String currentdir = getProperty ("user.dir");
out.print (currentdir + ">"); // ovanstående kod visar en kommandopromt med sökväg
String command = in.next (); //här måste jag kunna dela upp kommando och argument
if (command.equals("ls"))
{
ls ();
}
else if (command.equals ("mv"))
{
mv (argumen1, argument2);
}
public static void ls ()
{
File kat = new File (".");
String[] katFiles = kat.list ();
for (int i = 0; i < katFiles.length; i++)
{
System.out.println (katFiles[i] + " "); // listar filer i nuvarande katalog
}
}
public static void mv (String argument1, String argument2)
{
File f = new File (".", argument2);
argument1.renameTo (f);
System.out.println ("the file " + argument1 + "has been renamed to " + argument2);
}
Hoppas detta inte blev för rörigt och att någon fattar vad jag menar. Skulle vara riktigt uppskattat om någon kunde peta till koden rätt där jag behöver dela upp strängen om någon orkar läsa all kod

.
SV: Behöver lite java hjälp
Postat: 06 jul 2007, 12:54
av Okänd
Nåt i den här stilen borde fungera:
Kod: Markera allt
else if (command.equals ("mv"))
{
Scanner cmd = new Scanner(command);
String arg1 = cmd.next();
String arg2 = cmd.next();
if(arg1 == null || arg2 == null) {
System.out.println("bad arguments");
} else {
mv (arg1, arg2);
}
SV: Behöver lite java hjälp
Postat: 06 jul 2007, 16:37
av lennart
Tackar som fan!!!
koden du gav funkade efter justering till mina variabler.
Sjysst att du hade tålamod med mig

.
Två frågor till dock, finns det några metoder eller objekt som fixar kopiering av filer och finns det något fiffigt sätt så man kan förflytta sig i filsystemet i java, tänkte så man kan implementera cd kommandot?
Har kollat i java.io.File utan att hitta någonting tillfredsställande.
SV: Behöver lite java hjälp
Postat: 06 jul 2007, 16:47
av Okänd
tja, det enklaste skulle nog vara att du låter programmet hålla koll på vilken mapp du står i, typ skapa ett File objekt som heter du currentDir... Sedan om du får cd xxx så kollar du bara om det finns en mapp xxx i currentDir. Om du annars får nåt i stil med cd /zzz så försöker du bara skapa ett nytt File objekt och om det går bra så låter du currentDir peka på det filobjektet.
Sedan så skriver du bara ut currentDir.getName() eller getPath eller vad nu metoden heter.
Angående att kopiera filer så vet jag inte, om du vill kan ju bara skapa en ny fil, och sedan koppla ihop lite Readers och Writers för att manuellt kopiera över filen.
SV: Behöver lite java hjälp
Postat: 06 jul 2007, 19:10
av lennart
Är inte riktigt säker på om jag hänger med bifogar lite kod som kanske är åt rätt håll. Men jag får ivarje fall inte koden att funka som jag vill.
Kod: Markera allt
.......
String command = in.nextLine ();
Scanner scanner = new Scanner (command);
command = scanner.next (); // ovanstående kod matar in kommandon med argument
.......
.......
else if (command.equals ("cd"))
{
String arg1 = scanner.next();
cd (arg1);
}
.......
public static void cd (String argument)
{
File currentDir = new File (".");
File nextDir = new File (argument);
if (nextDir.exists ())
currentDir = nextDir; // väldigt osäker på denna rad???
String s = (currentDir.getName());
// String s = (currentDir.getCanonicalPath ()); gör jag denna istället så visas rätt sökväg, men antar att man inte byter plats i filsystemet.
System.out.println (s);
}
SV: Behöver lite java hjälp
Postat: 06 jul 2007, 23:53
av skaggapa
om jag bara får föreslå en alternativ lösning, även fast problemet är löst.
Kod: Markera allt
private static final InputStreamReader isr=
new InputStreamReader(System.in);
private static final BufferedReader br=new BufferedReader(isr);
private static final StreamTokenizer st=
new StreamTokenizer(br);
st.nextToken();
if(st.ttype==st.TT_WORD)
string s = st.sval();
angående kopiera filer så kan man ju låta java exekrevera systemkommandon.
System.exec("cp", "fil1", "fil2")
eller nåt sånt.
mvh
Anders
SV: Behöver lite java hjälp
Postat: 08 jul 2007, 23:44
av lennart
Tack Anders för förslaget, har dock inte hunnit med att testa det än, men skall göra så fort jag hinner, jag har fastnat på lite andra bagateller. Angånde kopieringen så har jag redan löst det, men har som sagt mindre problem. Hoppas någon kan hjälpa mig med detta?
Här följer kod för att illustrera problemen.
Kod: Markera allt
public static void cp (String argument1, String argument2) throws IOException
{
File oldfile = new File (argument1);
File newfile = new File (argument2);
if (oldfile.exists ());
{
long filelength = oldfile.length (); // blir fel med texten: "possible loss of precision found : long
required: int", funkar dock om man gör så här: int filelength = (int)oldfile.length (); men kan vara bra att ha long som fillängd?
newfile.createNewFile ();
byte[] bytesTocopy = new byte[filelength];
bytesTocopy = copy.readbytes (filelength, argument1);
copy.writebytes (bytesTocopy, filelength, argument2);
}
else // else och else if klagar kompilatorn på med följande text: "'else' without 'if'"
{
System.out.println ("the filename dosen´t exists");
break; // break satser klagar också kompilatorn på med texten: "break outside switch or loop" i alla mina metoder även om jag lägger dom i en if-sats som fungerar.
}
}
Observera att detta är oberoende fel av varandra dvs att om jag bortkommenterar två fel kvarstår ett. Kanske skall tillägga att metoderna ligger i en egen klass. Om någon känner sig manad att hjälpa mig skulle jag bli jätteglad. Skulle också vara snällt ifall någon kan hjälpa mig med hur man kan implementera "cd" kommandot fattar fortfarande inte hur jag skall gå till väga.
SV: Behöver lite java hjälp
Postat: 09 jul 2007, 00:48
av skaggapa
Jag tror jag vet vad det är som är fel.
När du lagrar ett stort tal i en long så kommer du att sätta de sista siffrorna(de minsta, närmast noll) till just noll och på så vis så förlorar du exakt hur stor filen är. En int tror jag räcker för dig den ger möjlighet till 2^31 -1 (trettio två bitar minus en för tecken) stora tal. Annars så kan du köra med klassen BigInteger som tilllåter dig ha hur stora tal som helst utan att förlora värdesiffror på slutet.
angående cd-kommandot titta på den här sidan
http://java.sun.com/docs/books/tutorial ... /file.html
det borde lösa dina problem

SV: Behöver lite java hjälp
Postat: 09 jul 2007, 00:57
av lennart
skaggapa du råkar inte veta varför jag inte kan göra else eller else if i mina metoder? Eller varför jag inte kan breaka???
Edit: Djävlar vilken sjysst tutorial du länka till, den tackar jag varmt för

.
Edit igen: Upptäckte felet med if-satserna hade visst råkat slå in ett kolon där, kraftigt irriterande.
SV: Behöver lite java hjälp
Postat: 09 jul 2007, 14:27
av skaggapa
Det är lungt, spana runt bland suns guider det finns väldigt mycket matnyttigt.
Jag antar att allt har löst sig?
mvh
Anders
SV: Behöver lite java hjälp
Postat: 09 jul 2007, 22:32
av lennart
Nästa hela mitt program funkar som jag har tänkt mig förutom att det kastar undantag när man skall kopiera kataloger. Förutom det så har jag fortfarande problem med att implementera "cd", fattar verkligen inte hur jag skall gå till väga för att bygga det kommandot, har lustläst allt om File klassen?
SV: Behöver lite java hjälp
Postat: 15 jul 2007, 19:14
av skaggapa
Hmm jag tycker det borde gå med standard java.
annars finns paketet jTUX
http://basepath.com/aup/jtux/
Men det är mer inriktat på att göra "low-level system calls" i unix det borde dock funka med linux.
men om du med standard java
Kod: Markera allt
//anropas med cd:s argument ex cd(..) cd(temp)
// returnerar en fil som pekar till det nya mappen
// kastar en exception som måste implementeras
private static File cd(String path){
File f = new File(path)
if(f.isDirectory())
return f;
else
throw new NoSuchDirException("No directory :"+path);
}
har inte kört koden men den borde funka.
Du måste själv implementera Exceptionen men det är ju en baggis

eller ändra till någon standard.
mvh
Anders
SV: Behöver lite java hjälp
Postat: 19 jul 2007, 11:16
av lennart
Har lyckats lösa "cd", men din variant ser bättre ut skall försöka implementera den istället. Jag undrar dock lite hur man skall designa sin kod, som det ser ut nu kör jag med ett main program som anropar olika metoder. Har läst på lite om hur man skapar egna object, men jag undrar i vilka situationer det är bra att göra egna object eller inte? Programmet ju funkar som det är tänkt utan egna object, men det kanske är bättre programmerings stil att göra egna object?
SV: Behöver lite java hjälp
Postat: 19 jul 2007, 12:55
av skaggapa
Det finns ju olika stilar av programmering och java som är fallet här är ju ett objektorienterat språk.
Om du ska vara helt korrekt och hålla på den objektsorienterade approachen så ska _allt_ vara objekt. Om man är riktigt nitisk så ska även siffor vara objekt.
Så långt har jag personligen aldrig gått.
Tänk också på att använda många små och väl dokumenterade metoder (kom ihåg att även metoder kan använda metoder) och tydliga namn.
Använd tabbar för att man enkelt ska se var olika satser börjar och slutar. Tror sun har exempel på hur man ska formatera sin kod på ett bra sätt.
och kom ihåg kommentera kommentera och kommentera speciellt om andra ska använda sig av eller se din kod även för dig själv.
Du behöver givetvis inte följa dessa riktlinjer men om du ska ha och göra med andra programmerare kan det bara lämpligt.
mvh
Anders
SV: Behöver lite java hjälp
Postat: 19 jul 2007, 14:00
av Victor
skaggapa skrev:
och kom ihåg kommentera kommentera och kommentera speciellt om andra ska använda sig av eller se din kod även för dig själv.
Kommentarer är överskattat, man ska skriva så pass enkelt och snyggt utformat så att koden talar för sig själv! Då behövs inga kommentarer..
SV: Behöver lite java hjälp
Postat: 19 jul 2007, 14:27
av Prometheus
Victor skrev:
Kommentarer är överskattat, man ska skriva så pass enkelt och snyggt utformat så att koden talar för sig själv! Då behövs inga kommentarer..
Jobbar man med andra är det bra att förklara sig så mycket som möjligt, det ger dessutom en chans för andra att lära sig av koden. Dvs välformad kod
och kommentarer - de är inte varandras motsatser.