Permalänk
Medlem

Java, lite arraytrubbel

Har fastnat lite på en grej här, har en applikation som med hjälp av olika jTextField's i ett GUI kan hämta/skriva/ta bort data ur en arraylista.
Använder mig utav set och get metoder som jag skrivit separat i en klass-fil. Sålångt fungerar allting bra och allting är bra, problemet är bara att jag försöker klura ut av hur man ska kunna använda sig av en array med fast antal platser? Får det inte att fungera, lyckas bara genom att hårdkoda in objekt i arrayen och det är inte så lyckat utan jag vill ha samma dynamik som tidigare.

Exempel på koden ser ut ungefär såhär för att lägga till objekt i min arraylista nu.

jTextArea1.setText(null); if (array==null){ array=array.getArray(); } nyGrej.setTitel(jTextField2.getText()); nyGrej.setAuthor(jTextField1.getText()); array.add(nyGrej);

Hur hade man kunnat lösa det med en objektarray istället? Söker absolut inte efter någon färdig kod eller liknande, det lär man sig inte mycket på utan mer en fingervisning om hur man ska gå tillväga.

Är hyfsat färsk på det här men jag lär mig sakta men säkert

Permalänk
Medlem
Skrivet av badbolll:

Har fastnat lite på en grej här, har en applikation som med hjälp av olika jTextField's i ett GUI kan hämta/skriva/ta bort data ur en arraylista.
Använder mig utav set och get metoder som jag skrivit separat i en klass-fil. Sålångt fungerar allting bra och allting är bra, problemet är bara att jag försöker klura ut av hur man ska kunna använda sig av en array med fast antal platser? Får det inte att fungera, lyckas bara genom att hårdkoda in objekt i arrayen och det är inte så lyckat utan jag vill ha samma dynamik som tidigare.

Exempel på koden ser ut ungefär såhär för att lägga till objekt i min arraylista nu.

jTextArea1.setText(null); if (array==null){ array=array.getArray(); } nyGrej.setTitel(jTextField2.getText()); nyGrej.setAuthor(jTextField1.getText()); array.add(nyGrej);

Hur hade man kunnat lösa det med en objektarray istället? Söker absolut inte efter någon färdig kod eller liknande, det lär man sig inte mycket på utan mer en fingervisning om hur man ska gå tillväga.

Är hyfsat färsk på det här men jag lär mig sakta men säkert

Jag förstår inte riktigt problematiken.

Menar du att du körde med en ArrayList tidigare och vill byta till en vanlig array?

Jag försöker förestalla mig programmet. Du har en array (av någon typ) med objekt "Grej". Varje "Grej" har en titel och en författare.
Du kan spara olika Grej-objekt till din array, du kan även hämta och ta bort dessa.

Vill du sätta en begränsning på hur många Grej-objekt som får plats i listan?

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Jag förstår inte riktigt problematiken.

Menar du att du körde med en ArrayList tidigare och vill byta till en vanlig array?

Jag försöker förestalla mig programmet. Du har en array (av någon typ) med objekt "Grej". Varje "Grej" har en titel och en författare.
Du kan spara olika Grej-objekt till din array, du kan även hämta och ta bort dessa.

Vill du sätta en begränsning på hur många Grej-objekt som får plats i listan?

Ja exakt. Ber om ursäkt om det var lite otydligt.

Jag vill alltså ha precis samma funktioner som jag har nu med en arraylista fast istället använda mig av en objektarray.
Ska kunna söka/ta bort/lägga till i den och det ska hamna på en indexposition osv.

Hoppas det blev lite klarare

Permalänk
Medlem
Skrivet av badbolll:

Ja exakt. Ber om ursäkt om det var lite otydligt.

Jag vill alltså ha precis samma funktioner som jag har nu med en arraylista fast istället använda mig av en objektarray.
Ska kunna söka/ta bort/lägga till i den och det ska hamna på en indexposition osv.

Hoppas det blev lite klarare

Ja, då är jag med.

Varför vill du använda en vanlig array?

En ArrayList har dynamisk storlek.
En vanlig array har en fördefinierad storlek, detta kommer du inte undan.

För att lösa problemet så kan man bygga en wapper-klass för att göra en större array som flyttar in de befintliga objekten från den första arrayn. MEN, detta har redan gjorts = ArrayList.

Det går ju att "fuska" genom att ge den arrayn en större storlek än vad som behövs just nu. Jag tror nog ändå att en ArrayList är bättre för det du vill göra, om dynamisk storlek är ett krav.

Om vi förbiser detta...

En array används på nästan samma sätt som ArrayList. Om du kollar upp grundfunktionen om hur en array fungerar så blir det lätt.
http://download.oracle.com/javase/tutorial/java/nutsandbolts/...

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Ja, då är jag med.

Varför vill du använda en vanlig array?

En ArrayList har dynamisk storlek.
En vanlig array har en fördefinierad storlek, detta kommer du inte undan.

För att lösa problemet så kan man bygga en wapper-klass för att göra en större array som flyttar in de befintliga objekten från den första arrayn. MEN, detta har redan gjorts = ArrayList.

Det går ju att "fuska" genom att ge den arrayn en större storlek än vad som behövs just nu. Jag tror nog ändå att en ArrayList är bättre för det du vill göra, om dynamisk storlek är ett krav.

Om vi förbiser detta...

En array används på nästan samma sätt som ArrayList. Om du kollar upp grundfunktionen om hur en array fungerar så blir det lätt.
http://download.oracle.com/javase/tutorial/java/nutsandbolts/...

Tack för svaret

Anledningen till att jag vill använda en vanlig array är att jag vill lära mig det också helt enkelt.
Jag vet på ett ungefär hur man skapar upp en sån array, problemet är att jag inte förstår hur man kan lägga till, ta bort, lista osv ifrån en array.

Ifrån en arraylista är det ju ganska enkelt och jag förstår hur det fungerar. Jag tror att jag kan använda samma set/get metoder även med en vanlig array men sen hur man knyter ihop det i ett GUI är lite knepigare.

Permalänk
Medlem

Skillnaden är ju som sagt att storleken är fördefinerad, hur du använder en array är relativt simpelt den största skillnaden är att arrayen innehåller massa tomma 'behållare' när den precis är skapad. Om du skapar en array utifrån en arraylist så kommer arrayen ha samma innehåll som listan dock
ex. på användning:
Klass[] variabelnamn = new Klass[storlek];
variabelnamn[0] = new Klass(); <- Instantierar ett objekt av typen klass och 'sparar' (kan refereras från) i arrayen på position 0.
sedan kan du efter det t.ex. invokera en metod på arrayen, variabelnamn[726].metodNamn(); så kommer metodNamn() för objektet på position 726 köras. (Förutsatt att det finns ett objekt att tillgå på den positionen). För att ta bort så ere bara sätta arrayelementet till null, så kommer det bli garbagecollectat (så länge som ingen annan referens finns).
Känns väldigt fel att skriva på svenska, usch ;< Du bör ha som vana att alltid skriva på engelska, både kod(variabler,metoder osv) och kommentarer. Lycka till^^

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av badbolll:

Tack för svaret

Anledningen till att jag vill använda en vanlig array är att jag vill lära mig det också helt enkelt.
Jag vet på ett ungefär hur man skapar upp en sån array, problemet är att jag inte förstår hur man kan lägga till, ta bort, lista osv ifrån en array.

Ifrån en arraylista är det ju ganska enkelt och jag förstår hur det fungerar. Jag tror att jag kan använda samma set/get metoder även med en vanlig array men sen hur man knyter ihop det i ett GUI är lite knepigare.

Bra svar. Som programmerare måste man kunna redogöra för sina beslut, men när det handlar om att lära sig så är alla vägar öppna.

Hade jag gjort det du gjorde nu så hade jag använt en ArrayList eller annan lite mer avancerad (än array) lista som bland annat har dynamisk storlek. Detta på grund av att antalet Grej-objekt är användardefinierad och inget som en utvecklare kan förutspå.
Hade jag däremot gjort en lista på veckodagar för någon egen slags kalender eller så hade jag nog använt en vanlig array, eftersom det alltid finns 7 dagar i veckan, aldrig mer eller mindre.

Gällandes GUI-biten så bör det vara på väldigt snarlikt sätt som när du arbetade med arraylist.
Om du ska hämta författaren objektet med index 4 förrut så gjorde du: myArrayList.get(5).getAuthor(); Nu gör du myArray[5].getAuthor();
Posta något om det känns svårt.

Gnejs förklarade rätt bra. Även jag skulle vilja slå ett slag för att hålla det till engelska. Kommentarer på svenska är helt ok.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Bra svar. Som programmerare måste man kunna redogöra för sina beslut, men när det handlar om att lära sig så är alla vägar öppna.

Hade jag gjort det du gjorde nu så hade jag använt en ArrayList eller annan lite mer avancerad (än array) lista som bland annat har dynamisk storlek. Detta på grund av att antalet Grej-objekt är användardefinierad och inget som en utvecklare kan förutspå.
Hade jag däremot gjort en lista på veckodagar för någon egen slags kalender eller så hade jag nog använt en vanlig array, eftersom det alltid finns 7 dagar i veckan, aldrig mer eller mindre.

Gällandes GUI-biten så bör det vara på väldigt snarlikt sätt som när du arbetade med arraylist.
Om du ska hämta författaren objektet med index 4 förrut så gjorde du: myArrayList.get(5).getAuthor(); Nu gör du myArray[5].getAuthor();
Posta något om det känns svårt.

Gnejs förklarade rätt bra. Även jag skulle vilja slå ett slag för att hålla det till engelska. Kommentarer på svenska är helt ok.

Det svåra är att det är ju inga speciella indexpositioner jag ska jobba med utan allt ska hanteras via ett ID som ett nytt objekt i arrayen tilldelas.
För det så använder jag "new random" som slumpar en int mellan 1 och 10 samt de två första bokstäverna i "namnet" på objektet jag lägger till.

När jag sen till skriva ut vad som finns i arrayen så kör jag;

for(Vara varan:minavaror) { jTextArea1.append(varan.getnamn()+"\t"+varan.getpris()+"\n"); }

Och när jag ska lägga till så kör jag; (dock utan slumpfunktionen här)

nyvara.setNamn(jTextField1.getText() ); nyvara.setPris(Double.parseDouble( jTextField2.getText() )); nyvara.setAntal(Integer.parseInt( jTextField3.getText() )); minavaror.add(nyvara);

Det är alltså det som kommer bli svårt med en vanlig array, måste ju ha en räknare som räknar upp på något sätt i en loop.
Är inte så bra på att förklara men ja.. Hoppas nån förstod

Permalänk
Medlem
Skrivet av badbolll:

Det svåra är att det är ju inga speciella indexpositioner jag ska jobba med utan allt ska hanteras via ett ID som ett nytt objekt i arrayen tilldelas.
För det så använder jag "new random" som slumpar en int mellan 1 och 10 samt de två första bokstäverna i "namnet" på objektet jag lägger till.

När jag sen till skriva ut vad som finns i arrayen så kör jag;

for(Vara varan:minavaror) { jTextArea1.append(varan.getnamn()+"\t"+varan.getpris()+"\n"); }

Och när jag ska lägga till så kör jag; (dock utan slumpfunktionen här)

nyvara.setNamn(jTextField1.getText() ); nyvara.setPris(Double.parseDouble( jTextField2.getText() )); nyvara.setAntal(Integer.parseInt( jTextField3.getText() )); minavaror.add(nyvara);

Det är alltså det som kommer bli svårt med en vanlig array, måste ju ha en räknare som räknar upp på något sätt i en loop.
Är inte så bra på att förklara men ja.. Hoppas nån förstod

Du menar att när du lägger in ett nytt Vara-objekt så måste du lägga det på en position i arrayn som inte redan är upptagen?
Ja, det stämmer.

Loopa arrayn och leta efter första position som är null, denna plats är ledig och där kan du lägga in ditt nya objekt.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av badbolll:

Det svåra är att det är ju inga speciella indexpositioner jag ska jobba med utan allt ska hanteras via ett ID som ett nytt objekt i arrayen tilldelas.
För det så använder jag "new random" som slumpar en int mellan 1 och 10 samt de två första bokstäverna i "namnet" på objektet jag lägger till.
...
Och när jag ska lägga till så kör jag; (dock utan slumpfunktionen här)
...
Det är alltså det som kommer bli svårt med en vanlig array, måste ju ha en räknare som räknar upp på något sätt i en loop.
Är inte så bra på att förklara men ja.. Hoppas nån förstod

Spelar ordningen på varor någon roll? Om inte..

class Vara { private String namn; private double pris; private int antal public Vara(String namn, double pris, int antal) { this.namn = namn; this.pris = pris; this.antal = antal; } public String getNamn() { return namn; } // getens namn... svengelska: det perfekta språket public double getPris() { return pris; } public int getAntal() { return antal; } public double getTotal() { return getPris() * getAntal(); // det vi skulle slänga på rabatt i getPris nångång så sköter totaluträkningen sig automatiskt pga metodanrop. } // ... mer kod } class Affär { private int antalVaror = 4; // den här får bara vara med för att // ge ett gemensamt antal fält / varor private JTextField[] varupris = new JTextField[antalVaror]; private JTextField[] varuantal = new JTextField[antalVaror]; private Vara[] varukorg = new Vara[antalVaror]; // ... annan kod public void visaTotal() { jTextArea1.setText(""); // rensa StringBuilder sb = new StringBuilder(); for (Vara vara : varukorg) { sb.append( vara.getNamn() ); sb.append( "\t" ); sb.append( vara.getTotal() ); sb.append( "\n" ); } jTextArea1.setText( sb.toString() ); } public void fyllVarukorg() { for (int i=0; i<antalVaror; i++) { double pris = Double.parseDouble( varupris[i].getText() ); int antal = Integer.parseInt( varuantal[i].getText() ); varukorg[i] = new Vara(pris, antal); } } }

något sådant kanske?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Tusen tack för era svar

Lyckas desvärre inte få till det, jag lyckas skapa en array och det är ungefär så långt jag kommer.

public static Bocker[] getBokArray(){ Bocker[] bok = new Bocker[100]; return bok; }

Hur jag sen ska kunna spara värden i arrayen (Namn, Adress) genom att hämta text från ett textfield vet jag inte, med arraylistan går det ju strålande för där behövs ju ingen räknare och inget "i" värde, det är där det skiter sig lite.

Nåja, bara att kötta vidare och försöka begripa

Permalänk
Medlem
Skrivet av badbolll:

Tusen tack för era svar

Lyckas desvärre inte få till det, jag lyckas skapa en array och det är ungefär så långt jag kommer.
.. kod..

Hur jag sen ska kunna spara värden i arrayen (Namn, Adress) genom att hämta text från ett textfield vet jag inte, med arraylistan går det ju strålande för där behövs ju ingen räknare och inget "i" värde, det är där det skiter sig lite.

Nåja, bara att kötta vidare och försöka begripa

Det går inte eftersom det inte finns någon koppling mellan Bocker och dina JTextFields. Istället tycker jag att du ska skapa en bok för varje par av JTextField (pris, antal) och lägga in den i din array. Pseudokod:

pris = JTextField-array för bokpris, längd på arrayen kallar vi "len" antal = JTextField-array för bokantal, längd samma som ovan bocker = tom Bocker-array av längd len i = for-loop från 0 till len: pris = Double-värdet av pris[i] antal = Int-värdet av antal[i] bok = ny Bocker(pris, antal) bocker[i] = bok

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det går inte eftersom det inte finns någon koppling mellan Bocker och dina JTextFields. Istället tycker jag att du ska skapa en bok för varje par av JTextField (pris, antal) och lägga in den i din array. Pseudokod:

pris = JTextField-array för bokpris, längd på arrayen kallar vi "len" antal = JTextField-array för bokantal, längd samma som ovan bocker = tom Bocker-array av längd len i = for-loop från 0 till len: pris = Double-värdet av pris[i] antal = Int-värdet av antal[i] bok = ny Bocker(pris, antal) bocker[i] = bok

Teknocide har en bra lösning på att angripa problemet.

Tänkte bara kompletera med två informationer om arrayer i Java

Alla element i en ny Objekt-array som är skapad med new är alltid null.
Arrayer har attributet length som returnerar kapaciteten på arrayen.

Så följande skriver ut 3 till exempel

Bok array = new Bok[3]; System.out.println( array.length );

//C

PS. Fixade en mindre bugg i koden

Permalänk
Medlem
Skrivet av Teknocide:

Det går inte eftersom det inte finns någon koppling mellan Bocker och dina JTextFields. Istället tycker jag att du ska skapa en bok för varje par av JTextField (pris, antal) och lägga in den i din array. Pseudokod:

pris = JTextField-array för bokpris, längd på arrayen kallar vi "len" antal = JTextField-array för bokantal, längd samma som ovan bocker = tom Bocker-array av längd len i = for-loop från 0 till len: pris = Double-värdet av pris[i] antal = Int-värdet av antal[i] bok = ny Bocker(pris, antal) bocker[i] = bok

Jag kanske är lite trög men det finns väl visst en koppling till böcker?

public void setNamn(String Namn){ this.Namn=Namn; } public void setID(int ID){ this.ID=ID; }

Samt att jag i mitt GUI sparar ner från textfälten till dom här set-metoderna.

Bocker nyBok = new Bocker(); nyBok.setNamn(jTextField2.getText()); nyBok.setID(jTextField1.getText());

Det är ju sen jag är ganska lost.. hur jag använder set/get-metoder jag skapat för att sen spara det här i en array
Kanske är ute och cyklar helt och hållet iofs!

Permalänk
Medlem
Skrivet av badbolll:

Jag kanske är lite trög men det finns väl visst en koppling till böcker?

1.

public void setNamn(String Namn){ this.Namn=Namn; } public void setID(int ID){ this.ID=ID; }

Samt att jag i mitt GUI sparar ner från textfälten till dom här set-metoderna.

2.

Bocker nyBok = new Bocker(); nyBok.setNamn(jTextField2.getText()); nyBok.setID(jTextField1.getText());

Det är ju sen jag är ganska lost.. hur jag använder set/get-metoder jag skapat för att sen spara det här i en array
Kanske är ute och cyklar helt och hållet iofs!

Jag tror inte du är trög. Vi kanske missförstår varandra, eller så försöker vi lösa problemet på två olika sätt. Om du tittar på din punkt nr 1. så har jag implementerat mina exempel på ungefär samma sätt, fast då handlade det om varor med pris och antal, och sedan om böcker.. och nu verkar det handla om boksamlingar med IDn... Jag förstår inte varför du ändrar ditt exempel mellan varje svar, men låt oss återgå till saken.

Ditt problem uppstår, som jag uppfattar det, direkt efter 2., då du ska spara undan nyBok till en array. Frågorna är: Vilken array då, och hur stor ska den vara?

Jag löser problemet genom att initiera tre arrayer direkt i början: En array för alla textfält som håller ett pris, en för alla antal-textfält, och en som kommer att innehålla alla böcker, när man har fyllt i alla fält. Dessa arrayer är lika långa vilket innebär att man kan iterera över varje par textfält (pris och antal) parallellt, och skapa ett bok-objekt samt spara undan detta i bok-arrayen på en och samma gång. Istället för att skriva

double pris1 = Double.parseDouble(jTextField1.getText()); int antal1 = Integer.parseInt(jTextField2.getText()); Bok bok1 = new Bok(pris1, antal1); bocker[0] = bok1; double pris2 = Double.parseDouble(jTextField3.getText()); int antal2 = Integer.parseInt(jTextField4.getText()); Bok bok2 = new Bok(pris2, antal2); bocker[1] = bok2; ...

eller liknande kan då skriva

for (int i=0; i<bocker.length; i++) { double pris = Double.tryParse( pris[i].getText() ); int antal = Integer.parseInt( antal[i].getText() ); Bok bok = new Bok(pris, antal); bocker[i] = bok; }

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Tack för svaren, löste sig nog tillslut. Lite småfix kvar bara