[Java] Mata in vektor från kommandofönstret

Permalänk
Medlem

[Java] Mata in vektor från kommandofönstret

Jag vill kunna skriva tex "1 5 24 250 6" och så ska det lagras i en vektor i programmet. Längden ska ej behöva specificeras vid inmatningen utan den ska mata in så länge den hittar ett heltal till (separerade med space som default brukar vara).

Finns det ingen enkel metod för detta?
Jag har försökt lite (nybörjare som jag är) med objekt av den nya Scanner-klassen som låter mig använda instans-metoden nextInt().

java.util.Scanner in1 = new java.util.Scanner(System.in); java.util.Vector v1 = new java.util.Vector(); v1.addElement(in1.nextInt());

Detta tex ger nåt varningsmeddelande om att det är osäker kod eller nåt. Dessutom när jag kör v1.trimToSize() för att sedan ta v1.capacity för att få längden på det inmatade så blir det alltid 1.

Metod 2 jag testade var typ såhär och den hoppar aldrig ur loopen förrens jag matar in tex en bokstav. Dessutom när den ska skriva ut vektorn så om jag matat in 5 element skriver den ut dom men följt av lika många nollor så något är säkert galet med denna inmatnings-slinga.

while (in1.hasNextInt()) { a1[i]= in1.nextInt(); i++; }

Vet inte om man kanske kan mata in det hela som en sträng istället och sedan göra om strängen till vektor om det finns nån sådan funktion?

Kan vara en del fel eller otydligheter i allt detta för jag har typ 3 olika program blandat i samma fil med massa utkommenterade rader överallt

Edit: Jo men det gick ju att lösa....med 3 Scanner-objekt. Först låta det första (från System.in) hämta in hela raden till en sträng, sedan loopa genom den med massa nextInt() och räkna hur många det finns. Sedan skapa en så stor array och låta det tredje Scanner-objektet läsa in int för int i arrayen

public static void main(String[] args) { System.out.println("Mata in en vektor med heltal: "); java.util.Scanner in1 = new java.util.Scanner(System.in); String s1 = in1.nextLine(); java.util.Scanner in2 = new java.util.Scanner(s1); java.util.Scanner in3 = new java.util.Scanner(s1); int i = 0; while (in2.hasNextInt()) { in2.nextInt(); i++; } int[] a2 = new int[i]; for (int i2 = 0; i2 < i; i2++) { a2[i2] = in3.nextInt(); System.out.print(a2[i2] + " "); }

Och fan ta den som skrattar åt min lösning

Visa signatur

CCNA sedan juni 2006

Permalänk
Medlem

Alltså ska du ha dem i en vector, eller en array?

EDIT:
Kan ju klistra in lite kod också kanske...

import java.io.*; import java.util.*; public class string2vec { public static BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); public static void main() { System.out.println("Program starting"); Vector vec=new Vector(); try { String in[]=(input.readLine()).split(" "); for(int i=0;i<in.length;i++) vec.add(new Integer(in[i])); } catch(IOException e){} catch(NumberFormatException e) { System.out.println("Only enter numbers please"); System.exit(0); } } }

EDIT2:
Såhär kan man också skriva det... Borde inte vara så svårt för dig att modifiera den så att den fungerar med scannerklassen istället (kör 1.4.2, så jag har inte scanner grejen själv, och jag orkar inte kolla upp hur den fungerar..)
OBS: Det är väldigt fult, och väldigt fel, att låta main kasta exceptions ("throws Exception" alltså), bara så att du vet...

import java.io.*; public class string2arr { public static void main() throws Exception { BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); System.out.print("\nMata in en vektor med heltal: "); String in[]=(input.readLine()).split(" "); int array[]=new int[in.length]; for(int i=0;i<in.length;i++) array[i]=Integer.parseInt(in[i]); } }

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem

Egentligen ska jag ju ha det i en array, men jag testade lite med både och.

Dock blir problemet när man lägger till element i en Vector att kompilatorn klagar på:
Note: Vector_test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Testa bara mitt lilla Vector_test program....vet inte vad som är fel :S
Funkar gör det ju dock men inte så kul med såna varningar. Hursomhelst löste jag det ju ändå, men då var jag tvungen att skapa 3 stycken Scanner-objekt (eftersom jag inte vet hur man nollställer ett sånt objekt så den börjar leta från början av strängen igen).

class Vector_test { public static void main(String[] args) { java.util.Vector v1 = new java.util.Vector(); v1.addElement(10); v1.addElement(15); v1.addElement(250); System.out.println(v1.capacity()); v1.trimToSize(); System.out.println(v1.capacity()); System.out.println(); for (int i = 0; i < v1.capacity(); i++) System.out.print(v1.get(i) + " "); } }

Visa signatur

CCNA sedan juni 2006

Permalänk
Medlem

addElement vill ha objekt som indata, en int är en primitiv datatyp, inte ett objekt..

Om du kör med Integer objektet fungerar det nog lite bättre..

class Vector_test { public static void main(String[] args) { java.util.Vector v1 = new java.util.Vector(); v1.addElement(new Integer(10)); v1.addElement(new Integer(15)); v1.addElement(new Integer(250)); System.out.println(v1.capacity()); v1.trimToSize(); System.out.println(v1.capacity()); System.out.println(); for (int i = 0; i < v1.capacity(); i++) System.out.print(v1.get(i) + " "); } }

EDIT:
Kollade lite på din kod ang. hur scanner funkade...
Kanske fungerar dethär isf:

import java.io.*; import java.util.*; public class string2arr { public static void main() { Scanner input=new Scanner(System.in); System.out.print("\nMata in en vektor med heltal: "); String in[]=(input.nextLine()).split(" "); int array[]=new int[in.length]; for(int i=0;i<in.length;i++) array[i]=Integer.parseInt(in[i]); } }

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem

Hehe, jag gjorde nyss såhär. Ser nu att du löste det ungefär likadant, fast du läser det direkt från input till en sträng-vektor, medans jag gör en sträng först och sedan till en sträng-vektor.
Din lösning är alltså lite bättre....ska testa det

class ovn3 { public static void main(String[] args) { System.out.println("Mata in en vektor med heltal: "); java.util.Scanner in1 = new java.util.Scanner(System.in); String s1 = in1.nextLine(); String[] splitted = s1.split("\\s"); int[] array1 = new int[splitted.length]; for (int i = 0; i < splitted.length; i++) { array1[i] = Integer.parseInt(splitted[i]); System.out.print(array1[i] + " "); } }

Är detta en bra metod måntro? Är det såhär man gör om man vill läsa in en vektor, eller är detta en enkel amatörlösning?

Skulle förövrigt vara trevligt om man kunde nollställa alla metoder som man använder för att stega igenom strängar...nextInt och nextLine och såna, från tex Scanner eller Tokenizer-klasser. Har man väl gått igenom hela raddan så får man skapa nytt objekt om man vill göra om det

Edit: Tack så mycket för hjälpen iallafall, och tack för påpekandet angående Vector. Jag trodde den skulle svälja vanliga primitiva datatyper men icke.
Undrar dock varför det inte vart så lyckat med mitt test av:

while (in1.hasNextInt()) { a1[i]= in1.nextInt(); i++; }

Alltså att den inte gick ur loopen förren jag matade in en bokstav.
Men det är väl så det funkar iofs. nextInt() går ju att mata in tal till antingen på en rad eller också ett tal per rad och trycka enter emellan....den fortsätter vänta på nya, så det är först när det kommer något som inte är en siffra som den ger upp och avbryter loopen antar jag. Borde ju gå att lösa på nåt sätt, ifall man nu vill kunna mata in vektorer på flera rader i ett svep

Visa signatur

CCNA sedan juni 2006