[Java] Alternatief voor Vector of array

Pagina: 1
Acties:
  • 171 views sinds 30-01-2008
  • Reageer

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-04 15:08
Ik heb op mijn faculteit basic lessen Java gehad en ik vind het interessant om er mee verder te gaan. Ik ben nu bezig met een programma om een nummerieke simulatie van een windtunnel te maken, alleen ik loop even tegen een probleem aan, welke waarschijnlijk een beetje basic is, maar ik kom er niet uit.

Ik heb dus een class gemaakt met aardig wat constructors, zodat ik veel controle uit kan oefenen op de simulatie. Het probleem is natuurlijk dat de lengte van de simulatie afhankelijk is van meerdere variabelen. Nu wil ik alle gegevens (windsnelheid, druk, temp en nog veel meer) opslaan. Nu dacht ik zelf aan Vectors, aangezien die een vooraf onbepaalde grootte hebben (en Array's van te voren bepaald moeten worden, wat gewoon praktisch onmogelijk is hier), alleen dan kom ik steeds in de problemen met doubles->Objects en viceversa. Het is wel mogelijk, alleen de code wordt dan nodeloos ingewikkeld en ik weet zeker dat er een makkelijkere manier moet zijn. Ook wil ik later bijvoorbeeld de mogelijkheid hebben om gegevens zoals maximale druk, temp e.d. te berekenen en op te vragen, dus het moet ook weer makkelijk toegankelijk zijn. (De simulatie is niet groot. Niet een paar 1000 gegevens ofzo hoor :) denk eerder aan 100 verschillende tijden waarop alle gegevens opgeslagen dienen te worden).
Weet iemand hoe ik het beter op kan slaan in variabelen of een andere oplossing.

Engineering is like Tetris. Succes disappears and errors accumulate.


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Misschien een klasse Meetgegevens maken die alle meetgegevens voor een tijdstip t bevat, heb je een Vector (liever nog ArrayList) met 100 objecten (voor 100 tijdstippen). ;)

[ Voor 11% gewijzigd door Amras op 11-06-2004 22:10 . Reden: kon op 2 manieren gelezen worden ]


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-04 15:08
Hmm..dat lijkt me toch niet echt een nette manier :) (is mijn persoonlijke mening).
Ik zit al lekker te zoeken op java.sun.com, maar kom er niet echt uit.
Wellicht dat alles wegschrijven in een textdocument makkelijk is.

Engineering is like Tetris. Succes disappears and errors accumulate.


Verwijderd

De Double-klasse is een wrapper voor de double-primitive.

Java heeft (helaas) ook nog zgn. "primitieve typen" die geen instantie van enige klasse zijn...

Maar daarvoor is de Double-klasse bedacht.


Maar het ligt er aan welke gegeven je precies wilt bijhouden. Zijn het eenmalige parameters of zijn het dynamische meetgegevens oid?

Ik vermoed het laatste. Er is weinig mis met een Vector, wellicht is deze wat traag in verhouding met een gangbare array.

Verwijderd

maak gebruik van een ArrayList of lees dit eens:http://java.sun.com/developer/onlineTraining/collections/

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
armageddon_2k1 schreef op 11 juni 2004 @ 22:02:
Hmm..dat lijkt me toch niet echt een nette manier :) (is mijn persoonlijke mening).
Het lijkt mij een nettere manier dan afzonderlijke arrays voor ieder meetgegeven. Stel je doet 100 metingen en je hebt 4 meetvariabelen, dat zouden dus 4 arrays van 100 elementen zijn. Maar wat nu als op 1 of andere gekke manier (er is veel mogelijk) 1 van de arrays maar 99 elementen bevat? Dan weet je dus niet meer welk meetgegeven in dat array bij de andere hoort. Misschien een beetje een vaag voorbeeld, maar afzonderlijke arrays zijn veeeel foutgevoeliger ;)

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-04 15:08
De enige constante verandering is de tijd, welke steeds toeneemt met 0.1 seconde.
Daarmee worden de volgende parameters bepaald:
-massa
-hoogte
-afstand
-uitstroomsnelheid
-snelheid
-acceleratie
-druk
-temperatuur1
-temperatuur2
-wrijving

Dat zijn dus aardig wat parameters (voor mijn doen dan) welke opgeslagen moeten worden. Misschien dat een textbestandje ook wel makkelijk is?

//edit: er zijn wat reakties voor mij gekomen..eerst die ff nalezen en checken

[ Voor 10% gewijzigd door armageddon_2k1 op 11-06-2004 22:08 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Verwijderd

Het gaat er niet om of de verandering constant is of niet! :D ;)

Het gaat er om of de inhoud van de variabele (min of meer) constant is of niet. :)
Dat is dus niet het geval bij een constante verandering.

Dus dan heeft het ook niet veel zin om die data in een textfile bij te houden.

Je kunt het ook handmatig doen, maak gewoon een tijdelijke array aan waarna je de andere array opnieuw instantieert (en dus leeggooit) met een aangepaste grootte.
Vervolgens in een loopje de waarden uit de tijdelijke array in de juiste array kopieren.

Maar wat is je bezwaar tegen een Vector?

[ Voor 8% gewijzigd door Verwijderd op 11-06-2004 22:11 ]


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-04 15:08
Als de variabelen bepaald zijn zullen ze constant zijn ja :), het is dus redelijk simpel, alleen dacht ik dat ik een veel makkelijkere manier over het hoofd zag voor het opslaan van al deze gegevens.

Engineering is like Tetris. Succes disappears and errors accumulate.


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Zou je een kort stukje code kunnen posten waaraan we kunnen zien hoe je die klasse hebt opgebouwd?

Verwijderd

Waarom maak je geen klasse "Windtunnel" die deze variabelen public heeft?

Wordt juist als bijzonder net gezien.

Verder zal je app niet echt bijster snel worden als je zoveel Vectors gaat construeren, maar ik weet niet of dat erg is (bij windtunnel berekeningen etc zou ik iig zeggen van wel...).

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-04 15:08
Ehm..het is nu een redelijke chaos geworden doordat ik alles nu probeer in Vectorvorm te stoppen, maar ik kom er wel uit. In ieder geval bedankt voor de tips.
Ik ben ook nog niet verder dan de constructors eigenlijk, dus veel is er niet te zien, maar ik bedenk eerst altijd hoe ik mijn programma helemaal opbouw. En dan voer ik wat kleine testjes uit.

Ik heb misschien nog een ideetje:
Ik heb 1 vector, namelijk results. In deze vector plaats ik steeds array, bestaande uit 11 entries, met de meetresultaten voor één meting. Zo vul ik dan die hele vector met allemaal arrays met de metingen.

[ Voor 27% gewijzigd door armageddon_2k1 op 11-06-2004 22:31 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Ik had zelf het volgende idee bedacht en ik hoop dat het een beetje klopt met wat je in gedachten had. In UML:

Afbeeldingslocatie: http://pierhagen.xs4all.nl/maarten/got_diagram.jpg

De klasse Meetgegevens bevat dan de meetgegevens voor een tijdstip t, ik heb nu alleen de massa nog toegevoegd maar hier moeten ook al je andere meetgegevens bij.

Hoe haal ik dan de massa op van de meting op tijdstip 3?
Java:
1
int massa = ((Meetgegevens) GetMeetgegevens(3)).getMassa();

Ik neem aan dat het invullen van de methoden geen probleem mag zijn. ;)

PS: sorrie voor de hoofdletters aan het begin van sommige methoden, ik doe een beetje teveel C# de laatste tijd. :P

edit:
Plaatje is beetje brak, hoop dat je het kunt lezen :X

[ Voor 7% gewijzigd door Amras op 11-06-2004 22:43 ]


Verwijderd

Amras schreef op 11 juni 2004 @ 22:41:

[afbeelding]

De klasse Meetgegevens bevat dan de meetgegevens voor een tijdstip t, ik heb nu alleen de massa nog toegevoegd maar hier moeten ook al je andere meetgegevens bij.
Ik denk dat dit indd de beste (en meest correcte) oplossing is. iig na het lezen van het probleem van de TS dacht ik ook aan iets dergelijks.
Het voordeel is dat je nu één Array (ArrayList!) vult met objecten (Meting) die de meetgegevens bevatten. Zo kun je die data dus ook weer heel makkelijk benaderen en manipuleren. De voorgestelde klasse Simulatie zal hoogstwaarschijnlijk een Thread of Runnable implementeren (zoek op java.sun.com) die per milliseconde de data ophaalt en opslaat in een nieuw Meetgegevens object. Misschien dat dit je in een richting helpt...

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
DokterAnders noemt Meting, wat een iets logischere naam is dan mijn Meetgegevens. Dat zou ik nog veranderen. ;)

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-04 15:08
Aha..bedankt, zo had ik het nog niet bekeken. Het vereist even een andere manier van benaderen, maar is uiteindelijk wel veel makkelijker.

Maar kan een arraylist variabel van grootte zijn? (Dat was eigenlijk een beetje de strekking van mijn oorspronkelijke vraag :)).

[ Voor 33% gewijzigd door armageddon_2k1 op 11-06-2004 23:53 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 24-05 11:06

Robtimus

me Robtimus no like you

armageddon_2k1 schreef op 11 juni 2004 @ 23:52:
Maar kan een arraylist variabel van grootte zijn? (Dat was eigenlijk een beetje de strekking van mijn oorspronkelijke vraag :)).
Een ArrayList is in feite niet veel anders dan een niet-gesynchroniseerde Vector: een array dat meegroeit indien nodig, met snelle random access (itt een LinkedList).

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
armageddon_2k1 schreef op 11 juni 2004 @ 23:52:
Het vereist even een andere manier van benaderen, maar is uiteindelijk wel veel makkelijker.
Zoek eens wat op over object georienteerd programmeren. Ik heb het idee dat ze je de syntax van Java hebben geleerd, maar niet echt wat object georienteerd programmeren inhoudt.
Maar kan een arraylist variabel van grootte zijn? (Dat was eigenlijk een beetje de strekking van mijn oorspronkelijke vraag :)).
Een ArrayList kan variabel van grootte zijn, het is eigenlijk een verbeterde versie van de Vector die je zelf al gebruikte. ;)
edit:
IceManX was sneller... :w

[ Voor 4% gewijzigd door Amras op 12-06-2004 00:10 . Reden: typo ]


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-04 15:08
Amras schreef op 11 juni 2004 @ 23:58:
[...]

Zoek eens wat op over object georienteerd programmeren. Ik heb het idee dat ze je de syntax van Java hebben geleerd, maar niet echt wat object georienteerd programmeren inhoud.

[...]
Ik weet zelf wel wat objectgeorienteerd programmeren inhoudt, alleen nooit echt gebruikt. Bij het college en de bijbehorende praktica JAVA die wij kregen beperkte het object-georienteerd programmeren zich tot aparte classes en die aanroepen om simpele taken te vervullen. Zo was onze laatste opdracht een virtuele cola-machine te maken, wat er uiteindelijk in de hoofdclasse zo uit moest zien:
Java:
1
2
3
4
5
...
ColaMachine sodapopper = new ColaMachine(100);
sodapopper.getCola();
sodapopper.refill();
...


daar eindigde onze java-cursus. Niet erg denderend dus, en aangezien die 1 week geleden is afgelopen en ik voor die cursus nog nooit eerder java gebruikt had of een andere taal (wel Div Gamesstudio 8) :/ ) het redelijk lastig is om te zien hoe ver je met object-georienteerd programmeren kan gaan.

Engineering is like Tetris. Succes disappears and errors accumulate.


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Wat de Ts even moet doen is op java.sun.com de uitleg bekijken van het Java Collections Framework: http://java.sun.com/j2se/...de/collections/index.html

Daarnaast denk ik dat je ook maar eens moet opzoeken wat OO nu precies inhoudt. Die gegevens die jij steeds in een array wilt stoppen daar kun je prima een class van maken, MeetPunt oid. Daar stop je alle meetwaardes van een bepaald tijdstip in, en vervolgens gooi je dat ding in een ArrayList, SortedSet whateva. Ligt er aan wat je er mee wilt doen.

Ik denk dat je snapt wat je wilt, maar nog niet ziet welke mogelijkheden Java voor je heeft om je werk makkelijk te maken ;)

klein voorbeeldje:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Lijst definieren
Set alle_waarden = new HastSet();

// 1 meting toevoegen
MeetPunt mp = new MeetPunt(tijd, windsnelheid, druk, temp);
alle_waarden.add(mp)

// Alle waarden opsommen
for (Iterator it = alle_waarden.iterator(); it.hasNext();)
{
  MeetPunt mp = (MeetPunt)it.next();
  output.print("tijdstip:" +mp.getTijd() +" meting:" +mp.getWindsnelheid());
}


Andere leuke optie is een HashMap gebruiken. Daar kun je elementen ingooien en ze (via een omweg) op dezelfde manier weer uit vissen. Maar als je ze er slim inzet kun je ze op tijdstip weer uitlepelen. In een hashmap plaats je een object met een key. Aan de hand van de key kun je dat object er weer uit halen, vb

Java:
1
2
3
4
5
6
7
8
9
10
11
// Lijst definieren
HashMap alle_waarden = new HashMap();

// 1 meting toevoegen, met als key tijd
MeetPunt mp = new MeetPunt(tijd, windsnelheid, druk, temp);
String key = "" +tijd;
alle_waarden.put(key,mp);

// Op tijd een meting terughalen
String key = "" +tijd;
MeetPunt mp = (MeetPunt)alle_waarden.get(key);


In laatste voorbeeld wel oppassen. Als er geen meetpunt is voor een tijdstip wat je opgeeft gaat dit fout.

[ Voor 62% gewijzigd door zneek op 12-06-2004 00:33 ]


Verwijderd

... maar dan heb je het ingewikkeldste ook meteen gehad. ;)

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 24-05 11:06

Robtimus

me Robtimus no like you

Amras schreef op 11 juni 2004 @ 23:58:
Een ArrayList kan variabel van grootte zijn, het is eigenlijk een verbeterde versie van de Vector die je zelf al gebruikte. ;)
Ik zou niet zozeer zeggen dat een ArrayList beter is dan een Vector of andersom. Ze lijken veel op elkaar, maar zijn er (tegenwoordig) voor verschillende doelen. Als je synchronisatie nodig hebt ga je eerder voor een Vector dan een ArrayList. Je kan dan wel een ArrayList gebruiken en wrappen mbv Collections.synchronizedList, maar dan krijg je vrijwel precies hetzelfde als een Vector (zelfs iets trager wegens extra functie aanroepen).
zneek schreef op 12 juni 2004 @ 00:16:
klein voorbeeldje:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
// Lijst definieren
Set alle_waarden = new HastSet();

// 1 meting toevoegen
MeetPunt mp = new MeetPunt(tijd, windsnelheid, druk, temp);
alle_waarden.add(mp)

// Alle waarden opsommen
for (Iterator it = alle_waarden.iterator(); it.hasNext();)
{
  MeetPunt mp = (MeetPunt)it.next();
  output.print("tijdstip:" +mp.getTijd() +" meting:" +mp.getWindsnelheid());
}
Ik hoop dat je een HashSet bedoelt? ;)
Andere leuke optie is een HashMap gebruiken. Daar kun je elementen ingooien en ze (via een omweg) op dezelfde manier weer uit vissen. Maar als je ze er slim inzet kun je ze op tijdstip weer uitlepelen. In een hashmap plaats je een object met een key. Aan de hand van de key kun je dat object er weer uit halen, vb

Java:
1
2
3
4
5
6
7
8
9
10
11
// Lijst definieren
HashMap alle_waarden = new HashMap();

// 1 meting toevoegen, met als key tijd
MeetPunt mp = new MeetPunt(tijd, windsnelheid, druk, temp);
String key = "" +tijd;
alle_waarden.put(key,mp);

// Op tijd een meting terughalen
String key = "" +tijd;
MeetPunt mp = (MeetPunt)alle_waarden.get(key);


In laatste voorbeeld wel oppassen. Als er geen meetpunt is voor een tijdstip wat je opgeeft gaat dit fout.
1: Een HashSet IS een HashMap, waarbij de value genegeerd wordt. Alles dat je met een HashSet kan kan dus ook met een HashMap
2: Je moet uitkijken met deze code, want als er 2 meetpunten met dezelde tijd zijn wordt de eerste overschreven door de tweede (ok, not likely, maar toch)

PS:
Ik zou trouwens niet voor een HashSet/Map gaan, want die behoudt geen volgorde. Een TreeSet/Map wel, je kunt zelfs een Comparator meegeven. De keys moeten zonder Comparator wel Comparable zijn.

[ Voor 6% gewijzigd door Robtimus op 12-06-2004 14:01 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Even IceMaxX 'verbeteren'. Een Vector is eigen deprecated. De eigenlijke manier om een syncronized ArrayList te krijgen, is door hem te wrappen in een SyncronizedList.
Een HashMap en HashSet lijken wel veel op elkaar. Maar om te zeggen dat ze hetzelfde zijn lijkt me iets te ver. Een Map is geen Collection, dus de interface is heel anders. Ook zou ik zeggen dat de key wordt gegenereerd in een HashSet en niet het value. Want de key is de hashcode.
Belangrijker waar je bij moet opletten met de HashSet (niet de HashMap) is dat de hashcode() methode van je objecten die je erin gaat stoppen goed geschreven is, anders gaat het snel fout.

Verder, als je volgorde wilt behouden moet je voor de LinkedHashSet/LinkedHashMap gaan. Die houdt intern een linkedlist bij die de volgorde bewaard. Een TreeSet/Map is een stukje langzamer dan een HashSet/Map, en je mag er alleen objecten meegeven die vergeleken kunnen worden.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 24-05 11:06

Robtimus

me Robtimus no like you

Macros schreef op 12 juni 2004 @ 14:51:
Even IceMaxX 'verbeteren'. Een Vector is eigen deprecated. De eigenlijke manier om een syncronized ArrayList te krijgen, is door hem te wrappen in een SyncronizedList.
Als dat zo was was de Vector deprecated geworden lijkt me.
Ik geef toe dat als Java nu geschreven zou worden de Vector waarschijnlijk wel achterwege gelaten zou worden.
Een HashMap en HashSet lijken wel veel op elkaar. Maar om te zeggen dat ze hetzelfde zijn lijkt me iets te ver. Een Map is geen Collection, dus de interface is heel anders. Ook zou ik zeggen dat de key wordt gegenereerd in een HashSet en niet het value. Want de key is de hashcode.
Wat ik bedoelde is dat HashSet is geimplementeerd met een HashMap. De keys in de Map zijn de elementen van de Set, en er is een private static final object dat als value wordt gebruikt. Ik zei ook niet gegenereerd maar genegeerd.
Belangrijker waar je bij moet opletten met de HashSet (niet de HashMap) is dat de hashcode() methode van je objecten die je erin gaat stoppen goed geschreven is, anders gaat het snel fout.
Klopt. De regel is ook dat als je de equals methode overschrijft, je de hashCode() methode moet overschrijven.

De rule of thumb:
- zowel equals als hashCode moeten dezelfde waarde teruggeven zolang de objecten waarvoor ze opgeroepen worden niet veranderen.
- als o1.equals(o2), dan moet o1.hashCode() == o2.hashCode().
- als !o1.equals(o2), dan mag wel o1.hashCode() == o2.hashCode()

Bron: Object.hashCode
De simpelste correcte manier is dus hashCode een constante te laten returnen, bv 0. Andere methoden zijn alleen maar efficienten in gebruik voor een HashSet/Map.
Verder, als je volgorde wilt behouden moet je voor de LinkedHashSet/LinkedHashMap gaan. Die houdt intern een linkedlist bij die de volgorde bewaard. Een TreeSet/Map is een stukje langzamer dan een HashSet/Map, en je mag er alleen objecten meegeven die vergeleken kunnen worden.
Heb je gelijk in, ik kende de LinkedHashSet/Map niet eens :X. TreeSet/Map is echter wel DE manier als je een andere ordening nodig hebt dan de volgorde van toevoegen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
ben ik met je eens IceManX. Ik wilde ook alleen een voorbeeldje geven en HashSet kwam als eerst in me op. Het gevaar van dubbele of niet bestaande keys gaf ik al aan. SortedSet of TreeSet noemde ik expres niet omdat je dan rekening moet houden met de implementatie van je class mbt het sorteerbaar/vergelijkbaar zijn.

Ik hoop dat de TS hier allemaal wat mee kan :)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:49

gorgi_19

Kruimeltjes zijn weer op :9

Een stukje afgesplitst naar [rml][ ALG] Belang van correcte hash en equal method *[/rml] :) 't begon een iets andere richting op te gaan. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1