Archief - [PROG][JAVA] Nakijken of een element in een lijst zit

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.

TiZon

Legacy Member
Hey

Ik zit hier met een vrij banaal Java-probleem...

Eerst even de methode:
Code:
private void btnZoekenKamersActionPerformed(ActionEvent evt) {
		if(gekozeMethodeDatum ==1)
			{
			vertrek=aankomst;
			vertrek.add(GregorianCalendar.MONTH,Integer.parseInt(txtOvernachtingen.getText()));
			}
		System.out.println("Van dag: " + aankomst);
		System.out.println("Tot dag: " + vertrek);
		
		List<Integer> bezet = domeinc.geefBezetteKammers(aankomst, vertrek);
		for(Integer getal:bezet)
			System.out.println(getal);
	
		int type=0;
		switch(this.aantalGasten) {
		case 1:case 2: type=lstTypesMogelijk.getSelectedIndex()+1; break;
		case 3:type=lstTypesMogelijk.getSelectedIndex()+3; break;
		case 4: type=lstTypesMogelijk.getSelectedIndex()+5; break;	
		}
		String arrayKamers[]= new String[15];
		
		List<Kamer> kamers = null;
		int t=0;
		for(Kamer kamer:domeinc.geefOverzichtKamers())		
			if(kamer.getZeezicht()==chkZeezicht.isSelected())
				if(kamer.getType()==type)
				{
						for(int i=0;i<arrayKamers.length;i++)
						{
								arrayKamers[t]=kamer.getNummer();
								t++;
						}
				}
				
		lstKamers.setListData(arrayKamers);
					
	}

Ik heb dus een lijst met bezette kamers (bezet) en een array waarin alle kamers staan die alvast aan andere kriteria voldoen (arrayKamers[])

Hoe kan ik nu alle kamers die bezet zijn (in lijst bezet zitten) uit de array met kamers halen?

Bedankt!
Bart

Bavo aka Joske

Legacy Member
In plaats van een array voor kamers (waarom?) gebruik je een ArrayList. Dan heb je twee List objecten: bezetList (niet omzetten naar integers, hou de kamers erin) en kamerList. Dat maakt het erg makkelijk om gewoon te doen:
Code:
	removeAll(Collection<?> c)
          Removes all this collection's elements that are also contained in the specified collection (optional operation).

Let wel: om zo met collections te werken moet je beide EQUALS en HASHCODE implementeren in de objecten die in de list zitten. Veel IDE's kunnen dat zelf, met Apache Commons kan je dat ook makkelijk. Indien anders stel ik zelf snel voor:

Code:
public class Kamer
{
    private int type;
    private boolean zeezicht;
    private int nummer;
    
    public boolean equals(Object other) {
        // check if other object if a Kamer
        if (!(other instanceof Kamer)) {
            return false;
        }
        // ifso cast it
        Kamer otherKamer = (Kamer)other;
        // check for all fields
        if (type != otherKamer.type) {
            return false;
        }
        if (zeezicht != otherKamer.zeezicht) {
            return false;
        }
        if (nummer != otherKamer.nummer) {
            return false;
        }
        // if all succeeded it is equal
        return true;
    }
    

    public int hashCode() {
        // return a hash that is spread based on object fields
        return 37*nummer;
    }
    
}

U ziet, u moet zien dat equals altijd TRUE is voor dezelfde objecten, FALSE indien niet. Hashcode overriden is verplicht, het is genoeg om weten dat het een getal moet weergeven op basis van de eigen velden.
Indien 'nummer' van kamer uniek is, is nummer vergelijken in equals misschien voldoende.

Vanaf je dit hebt gedaan in je Kamerobjecten kan je simpelweg doen:
List<Kamer> bezet = ...//getKamersBezet
List<Kamer> kamers = ...//bouw matches op
kamers.removeAll(bezet); //verwijder bezette

TiZon

Legacy Member
Bedankt!

Probleem is dat ik van mijn Bezette kamers alleen het nummer terug krijg, maar ik ben die methode eens aan het herschrijven omdat het maar een beetje brakke code is :)

Ik heb van mijn code nu dit gemaakt, maar soms klopt het nog niet, als iemand in een oogopslag zou zien wat er fout loopt..

Code:
	private void btnZoekenKamersActionPerformed(ActionEvent evt) {
	// Mogelijke kamerTypes = OK
		int type=0;
		switch(this.aantalGasten) {
		case 1:case 2: type=lstTypesMogelijk.getSelectedIndex()+1; break;
		case 3:type=lstTypesMogelijk.getSelectedIndex()+3; break;
		case 4: type=lstTypesMogelijk.getSelectedIndex()+5; break;	
		}
		
		
	//Datum verwerken = NOK
		if(gekozeMethodeDatum ==1)
			{
			vertrek=aankomst;
			vertrek.add(GregorianCalendar.DAY_OF_MONTH,Integer.parseInt(txtOvernachtingen.getText()));
			}
		System.out.println("Van dag: " + aankomst);
		System.out.println("Tot dag: " + vertrek);
	
		
	//Controleren Bezet
		List<Integer> bezet = domeinc.geefBezetteKammers(aankomst, vertrek);
		List<Kamer> allekamers = domeinc.geefOverzichtKamers();
		List<Kamer> allekamersMetCriteria = domeinc.geefOverzichtKamers();
		
		for(int i=0;i<allekamers.size();i++)
		{
			for(int j=0;j<bezet.size();j++)
			{
				if(bezet.get(j).equals(allekamers.get(i).getId()))
				{
					System.out.println("Kamer met Nr: " + allekamers.get(i).getNummer() + " gaat er uit omdat het bezet is!");
					allekamersMetCriteria.remove(i);
					
				}
			}
			if(!(allekamers.get(i).getZeezicht() == chkZeezicht.isSelected()))
			{
				System.out.println("Kamer met Nr: " + allekamers.get(i).getNummer() + " gaat er uit omdat het geen zeezicht heeft!");
				allekamersMetCriteria.remove(i);
			}
			if(!(allekamers.get(i).getType() == type))
			{
				System.out.println("Kamer met Nr: " + allekamers.get(i).getNummer() + " gaat er uit omdat het type niet klopt!");
				allekamersMetCriteria.remove(i);
			}
		}
		
	//List -> Array
		String arrayKamers[]= new String[allekamersMetCriteria.size()];
		for(int i=0;i<allekamersMetCriteria.size();i++)
			arrayKamers[i]=allekamersMetCriteria.get(i).getNummer();
						
	//Opvullen met kamers
		lstKamers.setListData(arrayKamers);
					
	}

Bavo aka Joske

Legacy Member
Tja, als jet 'nummer' veld uniek is, is dat genoeg, en dan heb je enkel de numers nodig van de mogelijke kamers om gewoon twee List<Integer> te maken, en daarop removeAll te doen. Dan heb je zelfs geen eigen equals en hashcode nodig omdat Integer dat al heeft.

Vanuit OO perspectief werk ik liever met de domein-objecten zelf, dan met integers.

TiZon

Legacy Member
Goh, ik heb het nog eens aangepast, en ik heb er nu dit van gemaakt:

Code:
private void btnZoekenKamersActionPerformed(ActionEvent evt) {
		// Mogelijke kamerTypes = OK
			int type=0;
			switch(this.aantalGasten) {
			case 1:case 2: type=lstTypesMogelijk.getSelectedIndex()+1; break;
			case 3:type=lstTypesMogelijk.getSelectedIndex()+3; break;
			case 4: type=lstTypesMogelijk.getSelectedIndex()+5; break;	
			}
			
			
		//Datum verwerken = NOK
			if(gekozeMethodeDatum ==1)
				{
				vertrek=aankomst;
				vertrek.add(GregorianCalendar.DAY_OF_MONTH,Integer.parseInt(txtOvernachtingen.getText()));
				}
			System.out.println("Van dag: " + aankomst);
			System.out.println("Tot dag: " + vertrek);
		
			
		//Controleren Bezet
			List<Integer> bezet = domeinc.geefBezetteKammers(aankomst, vertrek);
			List<Kamer> allekamers = domeinc.geefOverzichtKamers();
			List<Kamer> allekamersMetCriteria = domeinc.geefOverzichtKamers();
			
			for(int i=0;i<allekamers.size();i++)
			{
				for(int j=0;j<bezet.size();j++)
				{
					if((bezet.get(j).equals(allekamers.get(i).getId())) || (!(allekamers.get(i).getZeezicht() == chkZeezicht.isSelected())) || (!(allekamers.get(i).getType() == type)))
					{
						System.out.println("Kamer met Nr: " + allekamers.get(i).getNummer() + " gaat er uit!");
						allekamersMetCriteria.remove(i);
					}
				}
			}
			
		//List -> Array
			String arrayKamers[]= new String[allekamersMetCriteria.size()];
			for(int i=0;i<allekamersMetCriteria.size();i++)
				arrayKamers[i]=allekamersMetCriteria.get(i).getNummer();
							
		//Opvullen met kamers
			lstKamers.setListData(arrayKamers);
						
		}

En nu moet ik die methode 3-4x uitvoeren voor ik een juiste lijst krijg...
Ook krijg ik behoorlijk wat errors in mijn console ondertussen
"Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6"

Waarom moet ik verschillende keren die methode doorlopen voor het juist is?

Thx!
Bart

Bavo aka Joske

Legacy Member
Je bent fout bezig, herdenk uw algoritme, herschrijf uw code. Hou het proper en bedenk gewoon dat je ofwel twee lijsten van integer nodig hebt, ofwel twee lijsten van kamer.

TiZon

Legacy Member
probleem is dat ik van één kant integers krijg (kan er niet aan) en van de andere kant kamer-bojecten (wat OO-gezien, wel mooi is)

Ik heb het werkende gekregen, alleen ben ik er niet héél blij mee...

Code:
	private void btnZoekenKamersActionPerformed(ActionEvent evt) {
		// Mogelijke kamerTypes = OK
			int type=0;
			switch(this.aantalGasten) {
			case 1:case 2: type=lstTypesMogelijk.getSelectedIndex()+1; break;
			case 3:type=lstTypesMogelijk.getSelectedIndex()+3; break;
			case 4: type=lstTypesMogelijk.getSelectedIndex()+5; break;	
			}
			
			
		//Datum verwerken = NOK
			if(gekozeMethodeDatum ==1){
				vertrek = new GregorianCalendar();
				vertrek.setTime(aankomst.getTime());
				vertrek.add(GregorianCalendar.DAY_OF_MONTH,Integer.parseInt(txtOvernachtingen.getText()));
				}
			System.out.println("Van dag: " + aankomst.getTime().toString());
			System.out.println("Tot dag: " + vertrek.getTime().toString());
		
			
		//Controleren Bezet
			List<Integer> bezet = domeinc.geefBezetteKammers(aankomst, vertrek);
			List<Kamer> allekamers = domeinc.geefOverzichtKamers();
			List<Kamer> kamersVanType = new ArrayList<Kamer>();
			List<Kamer> kamersVanTypeEnZeezicht = new ArrayList<Kamer>();
			
			
			System.out.println("Kamers die bezet zijn:");
				for(Integer intje:bezet)
					System.out.println(intje);
				
				
				for(int i=0;i<allekamers.size();i++)
				{
					if(allekamers.get(i).getType() == type)
					{
						kamersVanType.add(allekamers.get(i));
					}
				}
				for(int i=0;i<kamersVanType.size();i++)
				{
					if(kamersVanType.get(i).getZeezicht() == chkZeezicht.isSelected())
					{
						kamersVanTypeEnZeezicht.add(kamersVanType.get(i));
					}
				}
				for(int j=0;j<bezet.size();j++)
				{
					for(int i=0;i<kamersVanTypeEnZeezicht.size();i++)
					{
						if((kamersVanTypeEnZeezicht.get(i).getId() == bezet.get(j)))
							kamersVanTypeEnZeezicht.remove(i);							
					}
				}

		//List -> Array
				String arrayKamers[] = new String[kamersVanTypeEnZeezicht.size()];
				for(int i=0;i<kamersVanTypeEnZeezicht.size();i++)
				{
					arrayKamers[i] = kamersVanTypeEnZeezicht.get(i).getNummer();
				}
			
		//Opvullen met kamers
			lstKamers.setListData(arrayKamers);
	}
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