Archief - Array in HashMap

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.

den_uil

Legacy Member
Ik probeer een Array in een HashMap te plaatsen. Ik denk dat dit correct wordt gedaan:

String[] loper= new String [14];
HashMap deelnemers = new HashMap();

public Loper(int nr, String nm, String vnm)
{
nummer = nr;
naam = nm;
voornaam = vnm;

string_nummer = Integer.toString(nummer);
loper[0] = string_nummer;
loper[1] = naam;
loper[2] = voornaam;
deelnemers.put(nummer, loper);
}


dus er is een array loper aangemaakt en een hashmap deelnemers.
de nr, naam en voornaam worden in de array gezet (allen strings)
vervolgens wordt de loper in een hashmap gezet (afhankelijk van de nr, nr wordt er dus eig 2x ingezet maar maakt voorlopig niets uit)


Nadien wil ik bvb de naam van de loper met een bepaalde nr terug uitlezen:

public String getNaam(int nr)
{
String[] testArray = new String[14];
testArray = deelnemers.get(nr);
return testArray[1];
}

ik maar een nieuwe tijdelijke array aan, en wil daarin de gevraagde array in oproepen (afhankelijk van de nr)
nu geeft eclipse de melding dat ik voor deelnemers.get(nr) - (String[]) moet zetten, ik kan het programma daarna runnen maar krijg dan volgende foutmelding:

Exception in thread "main" java.lang.NullPointerException
at Loper.getNaam(Loper.java:33)
at Test.main(Test.java:28)



Iemand een idee hoe ik dit kan oplossen of hoe ik dit beter zou doen.


Alvast bedankt!

Parnakra

Legacy Member
Wat ben je eigenlijk aan het doen? :s

Is Loper een klasse? Zoja, paste hier je volledige code.

Waarom gebruik je een array die groter is dan wat je er (momenteel) insteekt?

den_uil

Legacy Member
Die array is al zo groot omdat er later nog zaken bijmoeten, nu probeer ik eerst te test of het zo al werkt.

Dit is mijn volledige code:

Code:
import java.util.HashMap;



public class Loper 
{
	private int nummer;
	private String naam;
	private String voornaam;
	
	private String string_nummer;
	
	String[] loper= new String [14];
	HashMap deelnemers = new HashMap();
	
	public Loper(int nr, String nm, String vnm)
	{
		nummer = nr;
		naam = nm;
		voornaam = vnm;
		
		string_nummer = Integer.toString(nummer);
		loper[0] = string_nummer;
		loper[1] = naam;
		loper[2] = voornaam;
		deelnemers.put(nummer, loper);
	}
	
	public String getNaam(int nr)
	{
		String[] testArray = new String[14];
		testArray = (String[]) deelnemers.get(nr);
		if(testArray == null){
			System.out.println("Loper bestaat niet!");
		
		return "";
	}
	return testArray[1];
	}
}


Het is dus de bedoeling om een array aan te maken en deze in een hashmap te plaatsen.
Vervolgens moet ik elke array apart terug kunnen oproepen en de gegevens uit de array halen.


Ik weet niet of dit de beste manier is, het is de bedoeling om verschillende deelnemers (nummer, naam, adres, ...) op te slaan. Vervolgens moet ik deze kunnen bewerken en de gegevens ervan terug afdrukken.

Parnakra

Legacy Member
Dan raad ik aan om een klasse Evenement aan te maken en daarin de gegevens van alle deelnemers aan dat evenement bij te houden.

Dan kan je simpelweg een ArrayList/HashMap/Collection van Lopers bijhouden en ze zo snel oproepen.

Nu zit je design helemaal fout.

NeverwinterX

Legacy Member
De raad van Parnakra zou ik op volgen: dat is een object geörienteerder design. Het design ziet er nu wat raar uit: een loper heeft deelnemers? Denk goed na over de structuur.

Gebruik ook generics zodat je hashmap goed getypeerd is. Dat maakt het veel gemakkelijker om alles te lezen en te begrijpen en voorkomt vaak fouten zoals de bovenstaande. Tenzij je met Java 4 of vroeger werkt of echt gore/speciale dingen wilt doen.
Die hashmap definieer je dan zo:
Code:
HashMap<String, String[]> deelnemers = new HashMap<String, String[]>();
// of op analoge manier als het design verandert zoals Parnakra zegt
// met een arraylist kan je analoge dingen doen:
ArrayList<EenOfAndereKlasse> blabla = new ArrayList<EenOfAndereKlasse>();

den_uil

Legacy Member
't is ondertussen gelukt:

Code:
public class Loper extends HashMap<Integer, ArrayList<String>>
{
	HashMap<Integer, ArrayList<String>> mymap = new HashMap<Integer, ArrayList<String>>();
	String string_strnr;
	String string_pos;
	String string_gebdag;
	String string_gebmaa;
	String string_gebjaa;
	String string_ges;
	String string_ond;
	
	String string_uur;
	String string_min;
	String string_sec;
	
	public Loper()
	{
		super();
	}
	                                                                                                                                                            
	public void setArray(int nr, String nm, String vnm, String str, int strnr, int pos, String gem, int gebdag, int gebmaa, int gebjaa, boolean ges, boolean ond, int uur, int min, int sec)
	{
		string_strnr = Integer.toString(strnr);
		string_pos = Integer.toString(pos);
		string_gebdag = Integer.toString(gebdag);
		string_gebmaa = Integer.toString(gebmaa);
		string_gebjaa = Integer.toString(gebjaa);
		string_uur = Integer.toString(uur);
		string_min = Integer.toString(min);
		string_sec = Integer.toString(sec);
		
		string_ges = Boolean.toString(ges);
		string_ond = Boolean.toString(ond);
		System.out.println("ges " + ges);
		System.out.println("ond " + string_ond);
		
		
		if (ges == true)
		{
			string_ges = "man";
		}
		else if(ges == false)
		{
			string_ges = "vrouw";
		}
		
		if (ond == true)
		{
			string_ond = "5km";
		}
		else if(ond == false)
		{
			string_ond = "10km";
		}
		
		ArrayList<String> gegevens = new ArrayList<String>();
		gegevens.add(0, nm);
		gegevens.add(1, vnm);
		gegevens.add(2, str);
		gegevens.add(3, string_strnr);
		gegevens.add(4, string_pos);
		gegevens.add(5, gem);
		gegevens.add(6, string_gebdag);
		gegevens.add(7, string_gebmaa);
		gegevens.add(8, string_gebjaa);
		gegevens.add(9, string_ges);
		gegevens.add(10, string_ond);
		gegevens.add(11, string_uur);
		gegevens.add(12, string_min);
		gegevens.add(13, string_sec);
		

		mymap.put(nr, gegevens);
	}

	public String getNaam(int nr) 
	{
		ArrayList<String> gegevens = new ArrayList<String>();
		gegevens = mymap.get(nr);
		return gegevens.get(0);
	}

KiPpIe

Legacy Member
Ik snap het nog altijd niet. Waarom is een loper een hashmap en bevat het ook nog eens een hashmap?
Zou het niet beter zijn deze info in een externe klasse te plaatsen met de correcte methods om te storen/op te roepen?
En waarom werk je enkel met strings? Ik zou gewoon alles in zijn native gegevenstype bewaren en dan een Loper in een hashmap steken.
Kan ook altijd dat ik iets over het hoofd zie, maar ik vind heel de opbouw gewoon vreemd...

forloRn_

Legacy Member
Er is ruimte voor verbetering. :unsure:

Maar goed, Iedereen moet ergens beginnen natuurlijk.

tim1989

Legacy Member
Wat een verschrikkelijk design.
Waarom ga bv je al die attributen van Person in die arraylist steken die je daarna in die hashmap steekt? Slaat echt nergens op...
Ook de Person klasse laten overerven van een Hashmap met daarin nog eens een ArrayList???


Maak gwn een klasse Wedstrijd ofzo en zet daar een Hashmap<Integer, Person> in die je deelnemers noemt. Zo simpel is het.
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