[JAVA] Controlen in array lukt niet

Pagina: 1
Acties:

  • drpeer_holland
  • Registratie: September 2001
  • Laatst online: 08-09 12:46
Hoi,

Ik heb een klein probleem, hieronder staat een methode die moet controlen in de studenten array of die student met dat nummer al voorkomt zo ja, dan moet ie niets doen, als hij nog niet voorkomt moet hij hem toevoegen.
Maar nu kan ik gewoon 2 studenten met dezelfde studenten nummers toevoegen, het lijkt wel of hij niet controleert.

Weet iemand wat hier fout is ?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void addStudent(Student s)
    {
      boolean gevonden = false;
      for(int i=0; i <aantalStudenten; i++)
      {
        if (s.getNummer().equals(studenten[i].getNummer()));
        
            gevonden = true;
            aantalStudenten++;
      }
        if (!gevonden)
        
            studenten[aantalStudenten]=s;
        
      }

Grtz

  • Tim Schuhmacher
  • Registratie: Januari 2000
  • Laatst online: 13-09 17:11

Tim Schuhmacher

abasios

Is aantalStudenten wel gedefineerd?

Java vragen horen trouwens in /14

Check vooral de faq daar.

  • Canard
  • Registratie: Oktober 1999
  • Laatst online: 07-09 17:34
Op vrijdag 01 maart 2002 16:10 schreef drpeer_holland het volgende:
Weet iemand wat hier fout is ?
code:
1
stukje code
ik denk dat je code dit moet zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void addStudent(Student s)
{
  boolean gevonden = false;
  for(int i=0; i <aantalStudenten; i++)
  {
    if (s.getNummer().equals(studenten[i].getNummer()))
    {
    gevonden = true;
    aantalStudenten++;
    }
    if (!gevonden)
    {
    studenten[aantalStudenten]=s;
    }
  }
}

; verwijderd
{ } toegevoegd

  • OzBoz
  • Registratie: Maart 2000
  • Laatst online: 09-09 19:36

OzBoz

.:.H.:.I.:.P.:.

move vanuit W&G > P&W

My Fizion | My 3D prints | LinkedIn


  • drpeer_holland
  • Registratie: September 2001
  • Laatst online: 08-09 12:46
Op vrijdag 01 maart 2002 16:23 schreef OzBoz het volgende:
move vanuit W&G > P&W
Thnks.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Beetje vage methode. Als hij al gezet is, hoe weet je dat dan? Ik zie namelijk geen verschil als hij hem wel invoert en als hij er al bestaat (dwz voor het resultaat van de methode). Misschien kun je hem wat laten returnen om dat duidelijk te maken.

[edit] Probeer ook sneller uit je code te escapen. Stel je hebt nu een array van 5 mensen. Op plek 0 zit Henk met #1.
Als je nu bijv nogmaals henk wil toevoegen, dan loopt ie de hele array af, terwijl hij bij 0 al weet dat hij hem niet moet toevoegen.

ff wat slechte pseudo code
code:
1
2
3
4
5
6
7
8
loop_de_array_af{
   is_het_nummer_van_de_array_gelijk_aan_de_student?{
     Stoppen en de invoerder op z'n donder geven;
   }
}

Hmmz hij bestond niet, NU toevoegen;
invoerder vertellen dat het gelukt is;

  • Canard
  • Registratie: Oktober 1999
  • Laatst online: 07-09 17:34
Op vrijdag 01 maart 2002 16:27 schreef Glimi het volgende:
Beetje vage methode. Als hij al gezet is, hoe weet je dat dan? Ik zie namelijk geen verschil als hij hem wel invoert en als hij er al bestaat (dwz voor het resultaat van de methode). Misschien kun je hem wat laten returnen om dat duidelijk te maken.
inderdaad, laat de methode bijv. een int returnen met een bepaalde betekenis en definieer hiervoor constanten.

  • drpeer_holland
  • Registratie: September 2001
  • Laatst online: 08-09 12:46
Hoezo, vage Methode, hij controleert gewoon in het array studenten, of de student eral inzit of niet ?
Hij voegt daarna de student toe aan het array studenten[]

  • Canard
  • Registratie: Oktober 1999
  • Laatst online: 07-09 17:34
Op vrijdag 01 maart 2002 16:30 schreef drpeer_holland het volgende:
Hoezo, vage Methode, hij controleert gewoon in het array studenten, of de student eral inzit of niet ?
Er is alleen nog iets fout ?
Hij bedoelt dat je het resultaat van de addStudent bekend maakt aan de gebruiker van addStudent. In dit geval ben jij dat waarschijnlijk, maar dat hoeft niet perse. (dus return type toevoegen).
Heb je mijn code al geprobeerd (zie boven)?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 01 maart 2002 16:30 schreef drpeer_holland het volgende:
Hoezo, vage Methode, hij controleert gewoon in het array studenten, of de student eral inzit of niet ?
Er is alleen nog iets fout ?
Vage methode is een beetje hash gezegd jah. FF wat duidelijker.

Stel ik bied een dienst aan waarin ik voor jou een knikker in een zakje stop. Echter ik wil alleen verschillende knikkers in het zakje.

Jou methode is dus:
Je geeft me een knikker. Ik draai me om en gooi of de knikker weg (hij zat er al in) of dump hem in de zak. Dan draai ik me weer om. Weet jij nou wat er gebeurd is? Nee, jij denkt gewoon dat de knikker in de zak zit, terwijl hij in de goot zit.

Hoe moet het wel:
Jij geeft de knikker. Draai me om, trek m'n zak open en kijk erin. Dan scheld ik je of verrot omdat ik de knikker al had, of ik laat hem (voor je ogen) in het zakje vallen.

Beetje kinderachtig uitgelegd, maar was het eerste wat in me opkwam

[edit] Maar de fout zit hem nu dat je een ; achter je if zet. Als je een if maakt zonder { en } dan mag het effect maar 1 regel zijn (de volgende).

  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

en zo dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean addStudent(Student s)
{
  boolean gevonden = false;
  aantalStudenten = 0;
  // nu stop ie tenminste ook met z'n loop
  // als ie er een gevonden heeft
  while (!gevonden) {
  {
    if (s.getNummer().equals(studenten[i].getNummer()))
    {
    gevonden = true;
    aantalStudenten++;
    }
  }
  // niks gevonden dus toevoegen
  if (!gevonden)
  {
    studenten[aantalStudenten]=s;
  }
  return gevonden;
}

helpt dit een beetje :?

Waarom maak je trouwens van Studenten geen NamedList of zo... dan kan je het nummer als naam gebruiken en gaat alles vanzelf volgens mij (weet het niet zekers meer..)
Daar kan je even de Collection Framework op naslaan op de sun site...

SUC6!

Neem je whisky mee, is het te weinig... *zucht*


  • drpeer_holland
  • Registratie: September 2001
  • Laatst online: 08-09 12:46
Op vrijdag 01 maart 2002 16:34 schreef Glimi het volgende:

[..]

Vage methode is een beetje hash gezegd jah. FF wat duidelijker.

Stel ik bied een dienst aan waarin ik voor jou een knikker in een zakje stop. Echter ik wil alleen verschillende knikkers in het zakje.

Jou methode is dus:
Je geeft me een knikker. Ik draai me om en gooi of de knikker weg (hij zat er al in) of dump hem in de zak. Dan draai ik me weer om. Weet jij nou wat er gebeurd is? Nee, jij denkt gewoon dat de knikker in de zak zit, terwijl hij in de goot zit.

Hoe moet het wel:
Jij geeft de knikker. Draai me om, trek m'n zak open en kijk erin. Dan scheld ik je of verrot omdat ik de knikker al had, of ik laat hem (voor je ogen) in het zakje vallen.

Beetje kinderachtig uitgelegd, maar was het eerste wat in me opkwam
MMM... hoe moet ik dit nu veranderen in de java code ??

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 01 maart 2002 16:35 schreef momania het volgende:
en zo dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void addStudent(Student s)
{
  boolean gevonden = false;
  aantalStudenten = 0;
  // nu stop ie tenminste ook met z'n loop
  // als ie er een gevonden heeft
  while (!gevonden) {
  {
    if (s.getNummer().equals(studenten[i].getNummer()))
    {
    gevonden = true;
    aantalStudenten++;
    }
  }
  // niks gevonden dus toevoegen
  if (!gevonden)
  {
    studenten[aantalStudenten]=s;
  }
}

helpt dit een beetje :?

Waarom maak je trouwens van Studenten geen NamedList of zo... dan kan je het nummer als naam gebruiken en gaat alles vanzelf volgens mij (weet het niet zekers meer..)
Daar kan je even de Collection Framework op naslaan op de sun site...

SUC6!
Neuh, jouw while loopt stopt niet als er de student er nog niet in zit :) Probeer gewoon als je de student gevonden hebt OF een exception op te werpen (stopt de methode), of te breaken (stopt de methode) of heel lief bijv false te returnen (jaja, stoppen van de methode)

[edit] correctie, hij stopt wel. Maar da's geloof ik met een ArrayOutOfBoundsException :P

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Waarom gebruik je niet gewoon een van de Set implementaties uit het java.util package, deze heeft de door jou beschreven eigenschappen al.

  • momania
  • Registratie: Mei 2000
  • Nu online

momania

iPhone 30! Bam!

correctie, hij stopt wel. Maar da's geloof ik met een ArrayOutOfBoundsException :P
Ow ja, F**K...

Dat zeg ik: "waarom nog altijd die rottige arrays als je
tegenwoordig veel mooiere object voor dit soort dingen hebt... 8-)

Neem je whisky mee, is het te weinig... *zucht*


  • drpeer_holland
  • Registratie: September 2001
  • Laatst online: 08-09 12:46
Mmm..krijg hem helaas nog niet werkend

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
En welke code heeft u nu dan? :)

BTW het is misschien wel slimmer om een set te implementeren, maar dit is wel een goede oefening

  • drpeer_holland
  • Registratie: September 2001
  • Laatst online: 08-09 12:46
Nog steeds dezelfde code ?? Heb alles al uitgeprobeerd, ik kan nog steeds 2x dezelfde student toevoegen met het hetzelfde studentennummer

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Wat is alles geprobeerd? Naja eerst maar eens even de boel hotfixxen. Over de finesse komen we nog wel terug :P
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void addStudent(Student s){

      boolean gevonden = false;

      for(int i=0; i <aantalStudenten; i++){
        if (s.getNummer().equals(studenten[i].getNummer())){        
            gevonden = true;
            aantalStudenten++;
          }
       }
       if (!gevonden){
        
            studenten[aantalStudenten]=s;
        
       }
}

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

ik kan je misschien een paar tips geven:

vb.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class PersoonTable{

    //gebruik een hashMap ipv een array/arraylist/vector
    //in een lijst structuur van n elementen moet je n/2 elementen doorzoeken
    //naarmate de lijst langer wordt, wordt deze ook langzamer
    //hashmap heeft vaste performance loss bij het ophalen dus ongeacht het aantal
    //elementen gaat het zoeken even snel.
    private HashMap m_persoonHashMap = new HashMap();
    
    public void add(Persoon persoon){
        if(persoon == null){
            //waarom zou je null goedkeuren?
            throw new NullPointerException("persoon can`t be null");
        }
        Integer nummerInteger = new Integer(persoon.getNummer());
        
        if(m_persoonHashMap.containsKey(numberInteger)){
            //foutmelden als student nog een keer word toegevoegd, had
            //dus altijd eerst checken en niet 'vriendelijke' functies maken
            //daardoor krijg je soms van de vervelende bij effecten.
            throw new RuntimeException("persoon with number:"+persoon.getNumber+" can`t be added again");
        }
        
        //persoon bestaat nog niet, dus voeg hem toe aan de hashMap
        m_persoonHashMap.put(nummerInteger,persoon);
    }
    
    public boolean contains(Persoon persoon){
        if(persoon == null){
            //geen vriendelijke functie maken.. nergens goed voor.
            throw new NullPointerException("persoon can`t be null");
        }
    
        m_persoonHashMap.get(new Integer(persoon.getNummer()),persoon);
    }
    
    public Persoon get(int nummer){
        //stuurt null terug als persoon niet gevonden, hiermee kan je in 1 slag 
        //controleren of iemand bestaat en als ie bestaat beschikking hebben over die 
        //persoon.
        return (Persoon)m_persoonHashMap.get(new Integer(nummer));
    }
}

Voor uitleg over HashMap:
http://java.sun.com/j2se/1.4/docs/api/java/util/HashMap.html

voorwaarde aan dit geheel is dat een student zijn studentnummer niet meer mag veranderen anders zul je hem niet vinden in de hashmap (of je zou hem op nieuw in de hashmap moeten plaatsen als je het wel doet).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

En een array is voor deze taak totaal niet geschikt omdat je dus vast zit aan een vast aantal elementen, kijk anders naar een linkedlist/arraylist of zo iets. Deze kunnen dynamisch groeien en ik werk zelf niet vaak meer met arrays.

en voor algemeen verhaal over data structures zie:
http://www.theparticle.com/javadata.html

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 01 maart 2002 19:48 schreef Alarmnummer het volgende:
[knip]
Integer nummerInteger = new Integer(persoon.getNummer());
[knip]
<offtopic>
Zover ik zie doe je nu niets 'speciaals' met die integer, dus waarom geen int gebruiken? Die is toch een stuk sneller?
</offtopic>

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op vrijdag 01 maart 2002 21:10 schreef Glimi het volgende:

[..]

<offtopic>
Zover ik zie doe je nu niets 'speciaals' met die integer, dus waarom geen int gebruiken? Die is toch een stuk sneller?
</offtopic>
Yep, maar dat kan je niet meegeven als key aan een hashmap.

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Ok, ik herhaal het dan nog maar 's:
De Set interface in het java.util package schrijft voor dat elk element in de Set uniek is, dus geen 2 dezelfde instanties mogen in de Set voorkomen. Dit is precies de functionaliteit die de topicstarter wilt.
Als je vervolgens een HashMap gaat gebruiken om een Set te implementeren, terwijl er ook gewoon een HashSet bestaat die aan de voorwaarden voldoet is dan ook een beetje dubbelop.
Aangezien ik niet heb gezien dat er een hash nodig was, raad ik je aan om de TreeSet te gebruiken.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

ik ben het niet helemaal met je eens om de volgende redenen:
Op vrijdag 01 maart 2002 22:18 schreef Tomatrix het volgende:
Ok, ik herhaal het dan nog maar 's:
De Set interface in het java.util package schrijft voor dat elk element in de Set uniek is, dus geen 2 dezelfde instanties mogen in de Set voorkomen. Dit is precies de functionaliteit die de topicstarter wilt.
Het nadeel aan een HashSet is dat als je een bepaald element uit die HashSet wilt ophalen, is dat je geen get op basis van een key kan uitvoeren. De enigste manier om een element later weer uit de set te halen (lijkt me erg praktisch want een verzameling waar je alleen elementen in gaat zetten zonder ze later snel aan te kunnen spreken lijkt me vrij nutteloos) is mbv een iteratie en dat is niet bepaald snel (n/2 zoekacties), in tegenstelling tot de 'vaste performance' van de get van een HashMap doordat hij kan 'berekenen' waar hij moet zijn.

Een ander nadeel aan die HashSet is dat als je een reeds bestaande student gaat toevoegen dat deze over de oude word gezet en je het alleen met een boolean return waarde kan opsporen (die je eventueel kan negeren) terwijl je daarnaast het vervangen object kwijt bent. Deze fout is eigelijk zo groot dat er sprake is van een programmeerfout en die hoor je op dit punt te melden met een RuntimeException. (Je had die persoon niet mogen toevoegen terwijl je dit wel hebt gedaan). Daardoor kan er eventueel een inconsistentie in zijn geslopen in is die set nu eventueel inconsisten/beschadigt. Daarom werp ik hier een RuntimeException op zodat PersoonTable ten alle tijden conistent blijft en dus nog bruikbaar.
Aangezien ik niet heb gezien dat er een hash nodig was, raad ik je aan om de TreeSet te gebruiken.
Ik zou ook geen TreeSet nemen omdat je bij een HashMap een vaste tijd (volle buckets/rehashing en slechte hashfuncties buiten beschouwing gelaten) nodig bent om een element toe te voegen. En bij een TreeSet zal je dat log(n) tijd in beslag nemen. Naarmate je meer elementen toe gaat voegen zal dus een TreeSet in performance achteruit gaan en een HashMap niet.

Een bijkomend probleem is dat je weer lang bezig bent om een element op te halen (iteratie) of je zal zal zelf door die boom moeten wandelen en daarvoor eerst een temp student aanmaken om een comparable object te hebben zodat je element kan vinden hiervoor ben je weer log(n) zoek acties nodig. Ik denk niet dat dit de bedoeling is.

Een van de voordelen is dat hier een student heel eenvoudig te identificeren valt op basis van zijn nummer en daarom leent deze zich ook uitstekend voor om in een Hash collectie geplaatst te worden. Daarom ga ik hier dus ook voor de HashMap ipv HashSet of TreeSet.

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Op sommige punten heb je gelijk, op andere weer niet :) (vind ik)

Ik ben zowiezo van mening dat wanneer je een verzameling van unieke elementen wil representeren je de Set interface moet implementeren, puur om een signaal af te geven aan client programmers wat je met je klasse voor ogen hebt.

Nu ik even terug kijk naar het originele probleem zie ik dat het studentnummer inderdaad een goede hashcode zou zijn, het is dus waarschijnlijk inderdaad efficient om hier een hash-variant te nemen (ik ging er eigenlijk ook blindelings vanuit dat de HashSet ook key-value pairs had, maar de API docs vertellen mij iets anders).

Je moet er echter wel goed op letten wat het gebruik van je klasse is. Ik gebruik vaak zat verzamelingen waarbij ik nooit een specifiek element hoef op te zoeken, en waarbij een Iterator dus voldoet.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op vrijdag 01 maart 2002 23:49 schreef Tomatrix het volgende:
Op sommige punten heb je gelijk, op andere weer niet :) (vind ik)

Ik ben zowiezo van mening dat wanneer je een verzameling van unieke elementen wil representeren je de Set interface moet implementeren, puur om een signaal af te geven aan client programmers wat je met je klasse voor ogen hebt.
Dit ben ik 100% met je eens, alleen dit probleem zou je eenvoudig kunnen verhelpen door de PersoonTable PersoonSet te noemen en daarvoor hoef je geen gebruik te maken van een Set collectie. Ik zou er ook nog voor kunnen kiezen inderdaad om hem de Set interface te laten implementeren alhoewel ik nooit gek ben op bv boolean add(Object o) methodes omdat je compile time niet kan zeggen dat je alleen Personen accepteerd. Lang leve de generics :P

En door encapsulation is het eigelijk niet interessant wat voor collection structuur intern wordt gebruikt.

Ik heb hier trouwens ook gekozen voor composition tov inheritance dat ik controle hou over de te gebruiken methodes, want dit kan soms ook wel een voor gekke problemen zorgen :)
Je moet er echter wel goed op letten wat het gebruik van je klasse is. Ik gebruik vaak zat verzamelingen waarbij ik nooit een specifiek element hoef op te zoeken, en waarbij een Iterator dus voldoet.
In veel gevallen (kan ook snel want ik schrijf veel objecten :) ) kan ik meestal wel een hash functie voor elkaar krijgen, want ten slotte is ieder element uniek te identificeren. De vraag is alleen hoe makkelijk die sleutelset geintepreteerd/gebruikt kan worden. In de gevallen waarin ik geen hash functie kan maken gebruik ik altijd ArrayList`s omdat je hier heel eenvoudig door kan wandelen zonder gebruik te maken van de naar mijn mening minder lekker werkende itterator. Maar dit is een persoonlijke voorkeur.

ps: werken met Tree`s and Comparable interfaces gebeurt niet vaak omdat ik eigelijk niet vaak compare tussen objecten kan voorstellen/bedenken.

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Het mooie aan de Set is dat het een interface is natuurlijk dus dat je absoluut niet gebonden bent aan implementaties. En inderdaad, subklassen ben ik ook geen fan van, wat je dus het beste kan doen is:
code:
1
class PersoonSet implements Set

En vervolgens alle calls naar de Set methodes forwarden naar de geencapsuleerde collectie klasse naar wens.

Iterator is inderdaad een klote interface, vooral vanwege de remove methode, maar met een paar helper klassen zoals bijvoorbeeld de AbstractIterator die remove implementeert, en een ArrayIterator klasse kom je al een heel eind. In principe had ik aan Enumeration altijd genoeg :).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

volgens mij krijgt deze jongen wel een goed cijfer als dit huiswerk is ;)

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Ben alleen bang dat de docent het niet meer trekt :)
Maar ja, we hebben natuurlijk ook een zware taak nu mbravenboer er niet meer is...

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Kijken wij anders zijn huiswerk ff na en geven het cijfer door :)

ps: vind het ook superjammer dat martin er niet meer is want ik heb echt enorm veel van hem geleerd.

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Hehe, een soort huiswerk-service voor docenten. Kunnen we het lesgeven beter ook maar meteen over nemen.
Pagina: 1