Archief - [PROG]JAVA Moeilijk te beschrijven vraag, look inside ;)

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

yannick

Legacy Member
Het zit dus zo. Ik gebruik blueJ (Ik weet het, ma het moet voort school, zucht...)


Ik heb 5 klassen (Database,item,cd,video,game).

Cd en video extenden item. Database kan items toevoegen. Voor elke cd/video/game is een identifier die ik meegeef bij het maken van het object.

Dit object kan ik dan toevoegen via database (in een ArrayList). Maar nu zou ik willen weten hoe ik kan checken ofdat de id nog NIET in de ArrayList voorkomt ALVORENS (duh :p) hij het object toevoegd.

code Database
Code:
import java.util.ArrayList;
import java.util.Iterator;

/**
 * De klasse Database biedt de mogelijkheid om Cd- en Video-objecten 
 * op te slaan. Het is mogelijk om een lijst met alle cd's en videobanden
 * op de tekstterminal.
 * 
 * Deze versie slaat de gegevens niet op een opslagmedium op en
 * biedt geen zoekfuncties.
 */
public class Database
{
    private ArrayList items;

    /**
     * Maak een lege Database.
     */
    public Database()
    {
        items = new ArrayList();
    }

    /**
     * Voeg een item toe aan de database. Dit werkt dus NIET
     */
    public void addItem(Item theItem)
    {
        if(!items.contains(theItem.getID()))
        {
          items.add(theItem);
          System.out.println(theItem.getTitle());}
        else
          System.out.println("ERROR:Deze Titel bestaat al");      
    }

    /**
     * Druk een lijst af van alle tot nu toe opgeslagen cd's en videobanden
     * op de tekstterminal.
     */
    public void list()
    {
        for(Iterator iter = items.iterator(); iter.hasNext(); )
        {
            System.out.println(iter.next());       
        }
    }
}

code Item
Code:
/**
 * De klasse Item stelt een multimediaitem voor.
 * Informatie over het item is opgeslagen en kan worden bekeken.
 * Deze klasse fungeert als superklasse voor meer specifieke items.
 */
public class Item
{
    private String title;
    private String id;
    private int playingTime;
    private boolean gotIt;
    private String comment;

    /**
     * Initialiseer de velden van het item.
     */
    public Item(String theTitle, int time,String id)
    {
        title = theTitle;
        playingTime = time;
        this.id=id;
        gotIt = false;
        comment = "";
    }

    /**
     * Voer een commentaar in voor dit item.
     */
    public void setComment(String comment)
    {
        this.comment = comment;
    }

    /**
     * Retourneer het commentaar voor dit item.
     */
    public String getComment()
    {
        return comment;
    }

    /**
     * Zet de vlag of we zelf dit item hebben.
     */
    public void setOwn(boolean ownIt)
    {
        gotIt = ownIt;
    }

    /**
     * Retourneer informatie of we dit item zelf hebben.
     */
    public boolean getOwn()
    {
        return gotIt;
    }
    public String getID()
    {
        return id;
    }
    
    public String getTitle()
    {
        return title;
    }

    /**
     * Druk informatie over dit item af op het scherm.
     */
    public String toString()
    {
        String line1= "titel: " + title + " (" + playingTime + " minuten)";
        if(gotIt) {
            return line1 + "*\n"+"       "+comment+"\n";
        } else {
            return line1 + "\n"+"        "+comment+"\n";
        }
    }
    
    public void print()
    {
        System.out.println(toString());
    }
}

En tenslotte de code van CD (de rest laat ik buiten beschouwing)
Code:
/**
 * De klasse CD stelt een CD-object voor. Informatie over de 
 * CD is opgeslagen en kan worden bekeken.
 */
public class CD extends Item
{
    private String artist;
    private int numberOfTracks;

    /**
     * Constructor voor objecten van de klasse CD
     */
    public CD(String theTitle, String theArtist, int tracks, int time,String id)
    {
        super(theTitle, time,id);
        artist = theArtist;
        numberOfTracks = tracks;
    }

    /**
     * Retourneer de uitvoerend artiest voor deze cd.
     */
    public String getArtist()
    {
        return artist;
    }

    /**
     * Retourneer het aantal van tracks op deze cd.
     */
    public int getNumberOfTracks()
    {
        return numberOfTracks;
    }
    
    public String toString()
    {
        return super.toString() + "artist: "+artist+"\n"+"tracks: "+numberOfTracks+"\n";
    }
    public void print()
    {
        System.out.println(toString());
    }
    public String getTitel()
    {
        return super.getTitle();
    }
}

yannick

Legacy Member
Nope, doesn't work. Kheb da al is geprobeerd. Wat ik ook doe, hij blijft object met de dezelfde titel of id toevoegen :)

thnx voor de help al :)

jodeman

Legacy Member
Ah oei nee daar hebk geen rekening mee gehouden sorry

boolean aanwezig = false;
for(Iterator iter = items.iterator(); iter.hasNext(); ) {
Item item = (Item) iter.next();
String id = item.getID();
if (id.equals(theItem.getID())) {
aanwezig = true;
}
}

if(!aanwezig) {
items.add(theItem);
System.out.println("Item added");
} else {
System.out.println("ERROR:Deze Titel bestaat al");
}

dat moet beter gaan normaal

yannick

Legacy Member
Idd, die werkt :). Thnx!

Kwerk nog maar 3 maanden met java (en heb het pas gistere geleerd eig :p).
Da lijkt idd allemaal zo logisch die code, khad er zelf op moeten komen. Maja, ervaring ontbreekt nog wa :p

Bedankt voor de helpen met deze noob code :D

grtz

jodeman

Legacy Member
Graag gedaan

Uw code is wel goe voorzien van commentaar :).
for(Iterator iter = items.iterator(); iter.hasNext() && !aanwezig; ) {

is beter, dan stapt em uit de for lus als em het gevonden heeft.

yannick

Legacy Member
Ja idd, maakt het programma bij grote databases wat sneller werken :).

Thnx!

Linwe

Legacy Member
De omschrijving van u probleem is eigenlijk toch niet zo lastig zoals in uw titel opgegeven ;) Je wil gewoon dubbele items voorkomen in uw arraylist. Die code die hier gegeven staat werkt uiteraard, maar de vraag is: waarom gebruik je geen Map ipv een simpele List ? Een HashMap is hier bijvoorbeeld perfect van toepassing.

I'll even link ya ;) http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html

Psychokillah

Legacy Member
Kwestie van wat properder te programmeren
en minder overhead te hebben.

Code:
Iterator iter = items.Iterator();
while ( iter.hasNext() ) {
  Item item = (Item) iter.next();
  if (item.getID() == theItem.getID()) {
    items.add(theItem);
    System.out.println("Item added");
    break;
  } else {
    System.out.println("ERROR: Deze Titel bestaat al");
    break;
  }
}

Maakt op zich voor dit weinig uit,
maar ge kunt het beter van in den beginne deftig doen.

Maar het is inderdaad beter om in dit geval een map te gebruiken,
tenzij meerdere van uw attributen niet gelijk mogen zijn.

Ice

Legacy Member
als ge nu eens in uw item klasse dit toevoegt:
public boolean equals (Object o) {
if (o == this) {
return true;
}
if (o instanceof item) {
return true;
}
final Item item = (Item)o;
return item.getId().equals(this.getId);
}
public int hashCode() {
return this.getId().hashCode();
}


en dan kunde gewoon 'if arrayList.contains(item)' doen
(of ge gebruikt gewoon ne map uiteraard, wat veel handiger is in dit geval)

.Acku.

Legacy Member
Goed idee, als je er tenminste de bug uithaalt:
if (o instanceof item) {
return true;
}

naar

if (o !instanceof item) {
return false;
}

jodeman

Legacy Member
Psychokillah zei:
Code:
Iterator iter = items.Iterator();
while ( iter.hasNext() ) {
  Item item = (Item) iter.next();
  if (item.getID() == theItem.getID()) {
    items.add(theItem);
    System.out.println("Item added");
    break;
  } else {
    System.out.println("ERROR: Deze Titel bestaat al");
    break;
  }
}

Ge iets vergeten. Theitem.getId() returnt string. Dus met == gaat het niet.
Als ge het proper wilt houden doe je gewoon typesafety :

Code:
private ArrayList<Item> items; // (typesafety)

boolean aanwezig = false;
for (Item item : items) {
   String id = item.getID();
   
   if (id.equals(theItem.getID())) {
      aanwezig = true;
      break;
   }
}

En aan deze loop is toch totaal niets mis (denk ik),

Code:
for(Iterator iter = items.iterator(); iter.hasNext(); ) {

die jongen gebruikte dat en http://mindprod.com/jgloss/iterator.html hier staat die ook beschreven alsook op de sun site. Maakt al niet uit wat ge gebruikt denk ik :eek:. Voor overhead gaat het al niet zorgen denk ik.

.Acku.

Legacy Member
Iedereen is hier trouwens bezig over ene map, terwijl ik een set zou overwegen als alternatief voor een lijst zonder duplicates. Een map is een ander soort datastructuur (alhoewel die hier wel past aangezien je met unieke ID's werkt die 'mappen')

yannick

Legacy Member
Mja, in sets mogen sowieso geen dubbele instanties inzitten, das waar.

Khad gewoon sets en hashmappen juist geleerd en kwas er nog ni zo vertrouwd mee omda te gn gebruiken.

Ma kga eerst is mijn andere examens doen (java is ondertss al gdn, tging heel goed :]).

Bedankt voor de feedback :)

mvg
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan