Permalänk
Medlem

Enkel fråga om Java

Hej
Har fastnat på detta jobbiga lilla problem.

System.out.println ("Skriv in hur många.."); int n = in.nextInt (); String[] sv1 = new String[n]; String s1 = ""; for (int i = 0; i <= (sv1.length * 3); i++) { s1 = in.nextLine (); sv1 = s1.split (" "); } for (int i = 0; i < (sv1.length); i++) { System.out.print (sv1[0]); // Ska igentligen vara "i" har "0" för test }

Den sista for-loopen ska ju skriva ut strängen på index 0 eller hur?
Det gör den inte, den skriver ut strängen på index 3.
Hur funerar .split (" "); igentligen?

Meningen är att man ska skriva in
"Namn1 Ett 1" [enter]
"Namn2 Tvo 2" [enter]
i första for-loopen.

Då borde väl sv1 se ut såhär:

sv1 = {namn1, ett, 1, namn2, tvo, 2};

API: "String[] split(String regex)
Splits this string around matches of the given regular expression."

Permalänk
Medlem

Hejsan!

Problemet är att du endast uppdaterar de 3 första fälten i arrayn (svenska?) i den första for-loopen.

Körning 1: sv1 = {"Namn1", "Ett", "1"} Körning 2: sv1 = {"Namn2", "Tvo", "2"} osv...

Jag ska inte göra din hemläxa utan låta dig tänka lite till

En intressant sak som är svår att förstå i början är att att sv1 endast är en referensvariabel, detta resulterar i att när du deklarerar sv1 får den n platser. Men när du skriver sv1 = s1.split (" "); så ändrar du referensen så att sv1 refererar (tänk: vägskyllt till en plats i minnet) till resultatet från din regex-körning på s1, och har då endast 3 (_inte_ n) platser! Vet inte hur påläst du är om objektorientering, men det är värt att lägga lite tid på att förstå detta.

Lite trevlig läsning om du vill fördjupa dig: http://www.cs.lth.se/EDA016/forelasningar/ptdc-oh.pdf - Se speciellt slide 8 och 10 (sidan 2 och 3 i pdf-filen), lite svårt att förstå när man inte har en föreläsare som pratar, men kan ge en liten hint om hur det fungerar

Permalänk
Medlem

Körning 1: sv1 = {"Namn1", "Ett", "1"} Körning 2: sv1 = {"Namn2", "Tvo", "2"} osv...

Vilken nybörjartabbe. Läste ju det där i boken "skulle jag aldrig göra".
Nåja får väl hitta på något annat då. Grejen är att vi för göra vilka program vi vill bara det innehåller saker från det aktuella kapitlet i boken.

Det jag gör nu är kapitlet om Objekt. Det är bara så svårt att hitta på något program som ska vara nyttigt (kan ju göra helt onyttiga program också men det ser inte så bra ut) samtidigt som man är begränsad av att vara nybörjare. =/

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Klockan

Körning 1: sv1 = {"Namn1", "Ett", "1"} Körning 2: sv1 = {"Namn2", "Tvo", "2"} osv...

Vilken nybörjartabbe. Läste ju det där i boken "skulle jag aldrig göra".
Nåja får väl hitta på något annat då. Grejen är att vi för göra vilka program vi vill bara det innehåller saker från det aktuella kapitlet i boken.

Det jag gör nu är kapitlet om Objekt. Det är bara så svårt att hitta på något program som ska vara nyttigt (kan ju göra helt onyttiga program också men det ser inte så bra ut) samtidigt som man är begränsad av att vara nybörjare. =/

Uppgiften är långt ifrån omöjlig, ge inte upp! Lite tips: Du behöver en till for-loop - som ligger inne i den första for-loopen - som itererar tre gånger.

Mer (spoiler: markera för att se):

Där lägger du sedan in värdena ett efter ett (sv1[n + i] = ...)

Dold text
Permalänk
Medlem

Ok hade lagt ned det, åberopade "90% av att vara smart är att veta sina begränsningar" . Får väl endå testa igen.

EDIT: *glöm det* "Sidesteppade" det.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Klockan
Ok hade lagt ned det, åberopade "90% av att vara smart är att veta sina begränsningar" . Får väl endå testa igen.

EDIT: Hade ju testat med att den skrev i på indexet...

sv1[i] = s1.split (" ");

... och den säger att det är fel.

Testade din grej och det var fortfarande samma problem.

incompatible types found : java.lang.String[] required: java.lang.String sv1[k + i] = s1.split (" "); ^

Tack så länge iallafall har skapat den där for-loopen nu är det bara att lösa detta problem.

Hmm, inte riktigt så jag menade sv1[i] kan endast innehålla _ett_ String-objekt. s1.split(" ") returnerar en _array_ av String-objekt -->
_ett_ String-objekt != _array_ av String-objekt
och därför får du error.

Vill du ha den lösning som du nämner i ditt första inlägg, så får du se till att sv1 har n * 3 platser, och sedan måste lägga in de olika elementen från s1.split(" ") ett efter ett i sv1 (du får spara resultatet av s1.split(" ") i en temporär variabel och ta elementen där ifrån).

Dock kom jag precis på att det du antagligen vill göra är att lägga in en array i arrayen Det är mer logiskt ur datalagringssynvinkel (finns det ordet).

Isf måste du ha en String-array med två dimensioner.

String[][] sv1 = new String[n][3];

Och då behöver du knappt ändra något i den första koden du skrev, det enda du kommer få problem med är när du ska skriva ut kalaset

Kanske blev rörigt nu när jag pladdrade en massa eller?? Jaja, hoppas du förstår iaf

Permalänk
Medlem
Citat:

sv1[i] kan endast innehålla _ett_ String-objekt. s1.split(" ") returnerar en _array_ av String-objekt --> _ett_ String-objekt != _array_ av String-objekt och därför får du error.

Fattade det till slut men glömde skriva det här.

Så här ser det ut nu iallafall.

for (int i = 0; i <= (sv1.length * 3); i++) { s1 = in.nextLine (); for (int k = 0; k != 3; k++) { ks = s1.split (" "); //<< ks = {namn1, ett, 1}; js = (k + i); System.out.println (js); //<<<< skriver ut 0,1,2 *väntar på input* 3,4,5 *väntar på input* så den borde fungera med det här under. har inte satt ihop allt än //sv1 [js] = ks [i]; <<< sv1[0,1,2] = ks[0,1,2] *nytt input* sv[3,4,5] = ks[0,1,2] osv.. } i += 2;<< Fail } for (int i = 0; i < (sv1.length); i++) { System.out.print (sv1[i]); }

Edit: Ehh det är påväg iaf. Ska titta på 2D vektorn.

Permalänk
Medlem

sv1 [js] = ks [i] kommer resultera i:

sv1 = {"Namn1", "Namn1", "Namn1", "Tvo", "Tvo", "Tvo", ...}

Finn ett (1 bokstav) fel...

i += 2;<< Fail <--- Bara att plocka bort Sedan är det en del andra detaljer som behöver fixas till, gå långsamt igenom koden rad för rad och kolla att allt stämmer.
Med programmering så handlar det mycket om att tänka först, skriv sen - man sparar grymma mängder tid på det, tro mig Skulle nästan säga 70% tänka, 30% skriva.

En fråga, är det här en övning eller är det betygsgrundande???

Permalänk
Medlem
Citat:

En fråga, är det här en övning eller är det betygsgrundande???

Man undrar ju eller hur?

f here I come

Nämen

Citat:

Edit: Ehh det är påväg iaf. Ska titta på 2D vektorn.

Har gjort en 2D vektor och ska nog få den att fungera. Tack för all hjälp, ska inte fråga något mer nu. Har redan lätt till att jag använder en 2D-vektor som jag borde kommit på själv om jag tänkte efter lite.

EDIT: Nästan dag (onödigt att "bumpa"): gjorde om allt och skapade ett eget objekt istället som gör det jag försökte igår och mer där till.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Klockan
Man undrar ju eller hur?

Anledningen till att jag frågade var att om det inte varit en inlämning/labb/annat betygsgrundande så hade jag kunnat ge dig en lösning - med som motkrav att du läser det ordentligt och förstår hur _allt_ fungerar, för att sedan göra en egen lösning utan att kolla på min. För din egen skull naturligtvis

Men det bästa är ju naturligtvis som du gör nu och gör din egen lösning, det är då man lär sig. Programmering handlar ju inte om att lära sig syntax, utan om att förstå hur man bryter ner problem i algoritmer, för att sedan implementera dessa.

Permalänk
Medlem

Nytt problem!

Denna gång med objektet InputStreamReader.
Det läser ju in "line.separator", hur gör man så att .read () hoppar över "line.separator"?
Står verkligen ingenstanns.

Verkar ha något med detta att göra:

char c = (char) isr.read (); String radslut = System.getProperty ("line.separator"); while(radslut.indexOf (c) < 0) { c = (char) isr.read (); }

EDIT:
Går ju att göra såhär men finns det något snyggare sätt?

char c1 = (char) isr.read (); isr.read (); isr.read (); char c2 = (char) isr.read ();

Permalänk
Medlem

Oj, dom där klasserna har jag aldrig använt Jag skulle istället använda java.util.Scanner för att läsa från kommandotolken.

Permalänk
Medlem

Jo jag med. Har inte förstått vad som är bra med dessa, "nya" klasser.