Array in HashMap

Status
Niet open voor verdere reacties.

Kevin00

Gebruiker
Lid geworden
10 sep 2010
Berichten
7
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!
 
Nullpointerexception betekent dat je variable ergens een Null Waarde heeft

Dit stukje code klopt niet helemaal
Code:
public String getNaam(int nr)
{
String[] testArray = new String[14];
testArray = deelnemers.get(nr);
return testArray[1];
}

Je maakt hier een nieuwe Array aan maar wat je dan vervolgens doet is je vult maar 1 waarde 1 en de Array telt vanaf 0
Dus daarom heeft testArray[1] geen waarde.

Wijzig daarom de laatste regel code naar dit
Code:
return testArray[0];

Dit zou als het goed moet zijn werken.

Byee VRC
 
Neen dat werkt ook niet, krijg dezelfde foutmelding.

Ik zet een volledige array in de HashMap, vervolgens probeer ik die terug uit te lezen en in een andere array te zetten zodat ik de variabelen dan apart kan uitlezen.
 
Controleer of de opgevraagde loper wel bestaat.

Code:
public String getNaam(int nr)
{
String[] testArray = new String[14];
testArray = deelnemers.get(nr);
if(testArray == null){
 System.out.println("Loper bestaat niet!");
 return "";
}
return testArray[1];
}
 
Neen inderdaad er is geen loper aangemaakt, nu weet ik niet niet of dat is omdat er geen is aangemaakt of omdat hij verkeerd uitleest.

Dit is de volledige code:

[JS]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];
}
}[/JS]



PS: Ik heb volgende lijn wel moeten veranderen (String[]) ervoor gevoegd:
32 testArray = (String[]) deelnemers.get(nr);
 
Code:
		Map<Integer, String> mymap = new LinkedHashMap<Integer,String>();
		mymap.put(1 ,"een");			
		mymap.put(2 ,"twee");	
		mymap.keySet().toArray();
		mymap.values().toArray();
 
Je code werkt nu wel correct. Ik denk alleen niet dat hetgeen wat je nu hebt gemaakt is wat je wilt.

Je maakt voor elke loper een eigen HashMap met deelnemers. Het enige wat je hierin stopt is de huidige loper. Als je een nieuwe loper maakt maak je ook weer een nieuwe HashMap en daar stop je ook alleen de huidige deelnemer in.
 
'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);
	}
 
Het "extends HashMap<Integer, ArrayList<String>>" is nergens voor nodig aangezien je hier niets meedoet. (Met extends HashMap wordt de class ook een soort HashMap, je kunt dan de methoden van HashMap aanroepen d.m.v. super.methode.)

De "super();" in de constructor (Loper()) is dan ook niet meer nodig/geldig.


Daarnaast blijft hetgeen wat in mijn vorige post geldt nog steeds. Je maakt voor elke loper een nieuwe myhashmap. Als je twee lopers maakt, loper een met nr 1 en loper twee met 2 voor het gemak. Moet je loper een.getNaam(1) gebruiken of twee.getNaam(2) gebruiken. Als je bijvoorbeeld twee.getNaam(1) gebruikt krijg je een nullpointerexception omdat 1 alleen bestaat in de hashmap van loper een.

Je kunt dit oplossen door static te gebruiken, dus "static HashMap<Integer, ArrayList<String>> mymap = new HashMap<Integer, ArrayList<String>>();" hoewel dit niet een perfect oplossing is.
 
Waarom zo moeilijk ?

Maak een class Loper met daarin alle gegevens van de loper en een klas Deelnemers dit een Map bevat van alle lopers.

het gebruik van boolean voor geslacht is niet goed, gebruik een hiervoor een enum... Als je later lopers krijgt waarvan je geslacht niet weet zit je met een probleem. Een ENUM is zo uitgebreid met "Onbekend"..

Probeer ook altijd controles in te bouwen. Als je een niet bestaande loper opvraagt krijg je gelijk een duidelijke foutmelding en geen onduidelijk null pointer exceptions...

succes

Code:
public class Loper {
private String achternaam;
private String voornaam;
private boolean geslacht;
//...enz..

public Loper(String achternaam, String voornaam, boolean geslacht) { 
this.achternaam = achternaam;
this.voornaam = voornaam;
this.geslacht = geslacht();
}

public Loper(String[] data) {  //constructor met data in een array...
if (data == null || data.length != 3) {
    throw new IllegalArgumentException("array moet 3 strings bevatten");
}
this.achternaam = data[0];
this.voornaam = data[1];
this.geslacht = Boolean.toBoolean(data[2]);
}

public String getAchternaam() {
 return achternaam;
}

public String getVoornaam() {
 return voornaam;
}

public String getGeslacht() {
 return geslacht ? "man" : "vrouw";
}

}

Code:
public class Deelnemers {
    private Map<Integer,Loper> lopers = new HashMap<Integer,Loper>();

public Deelnemers() {

    Loper loper1 = new Loper("jansen","jan",true);

   String[] loperArray = "Jansen:Jan:true".split(":");
    Loper loper2 = new Loper(loperArray);

   lopers.put(volgendeLoperNummer(), loper1);  //Loper nummer wordt automatisch aangemaakt...
   lopers.put(volgendeLoperNummer(), loper2);
    
private Integer volgendeLoperNummer() {
return Integer.valueOf(lopers.size() + 1);
}

public getVoornaam(int lopernr) {
    return getLoper(lopernr).getVoornaam();
}

public getGeslacht(int lopernr) {
   return getLoper(lopernr).getGeslacht();
}

private Loper getLoper(int lopernr) {
   Loper loper= lopers.get(Integer.valueOf(lopernr);
   if (loper == null) {
   throw new illegalArgumentException("loper met nr" + lopernr + " is onbekend");
  }
return loper;
}

}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan