Behöver lite java hjälp

Här diskuteras programmering och utveckling
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

Behöver lite java hjälp

Inlägg 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
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Behöver lite java hjälp

Inlägg 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...


Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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 :)
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Behöver lite java hjälp

Inlägg 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...
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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 :).
Senast redigerad av 1 lennart, redigerad totalt 6 gånger.
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Behöver lite java hjälp

Inlägg 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);
            }
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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.
Senast redigerad av 1 lennart, redigerad totalt 6 gånger.
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Behöver lite java hjälp

Inlägg 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.
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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);
}
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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.
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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 =)
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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.
Senast redigerad av 1 lennart, redigerad totalt 9 gånger.
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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?
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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
Användarvisningsbild
lennart
Inlägg: 70
Blev medlem: 20 okt 2006, 21:31
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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?
Kör Ubuntu 9.10 aplha5, länk till min hårdvara http://www.komplett.se/k/ki.aspx?sku=32 ... roductTabs.
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: Behöver lite java hjälp

Inlägg 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.

Kod: Markera allt

Integer in = new Integer(2);
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
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Behöver lite java hjälp

Inlägg 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..
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Användarvisningsbild
Prometheus
Inlägg: 401
Blev medlem: 14 sep 2006, 09:42
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS
Ort: Garphyttan
Kontakt:

SV: Behöver lite java hjälp

Inlägg 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.
/ Mattias från designbilder.se
Skriv svar

Återgå till "Programmering och webbdesign"