[JAVA] HashMap

Pagina: 1
Acties:
  • 271 views sinds 30-01-2008
  • Reageer

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Hoi,

Ik wil een dynamisch tabel maken. Dat wil ik doen d.m.v. de html string in java te genereren en die string op de httprequest te zetten. in de jsp hoef ik dan alleen nog die string aan te spreken. Nu heb ik door hoe en wat ik in java en in jsp moet doen om resultaat te zien.
voorbeeld van java gegenereerd html string:
Java:
1
String html = tr + a + href + "c:\\test1.html" + u_href + td + "\"" + "100px" + "\"" + "bgcolor=" + "\"" + "red" + "\"" + "height=" + "\"" + "20px" + "\"" + u_href + "test java" + u_td + u_a + u_tr; 


Het punt is dat html code gegenereerd moet worden aan de hand van een List van HashMap. Even kort het voorbeeld hoe zo'n variable eruit ziet:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
private void generator()
{
String eqp1 = "TD0101";
List sh1 = new ArrayList(0);
String[] s1 = {"1", "idle", "2005052012000000", "2005052012010000", "10000", "", "2"};
//uitleg: {id, status, begindatum, einddatum, duur, voorgaande id, volgende id}
String[] s2 = {"2", "inproc", "2005052012010000", "2005052012020000", "10000", "1", "3"};
sh1.add(s1);
sh1.add(s2);
HashMap temp = new HashMap();
temp.put(eqp1, sh1);
m_EqpStateHistoryListQueryTO.add(temp); //dit is een List variabele
}


de html moet voor het tabel de key "TD0101" plaatsen, per String[] een kolom genereren en per "idle" of "inproc" de kolom achtergrond op geel of groen zetten. De kolom breedte in pix wordt dan ingesteld aan de hand van 5de item in de String[].

Dit is dus een voorbeeld van HashMap met 1 item. De bedoeling is natuurlijk dat er meerdere items in de HashMap zullen zitten.

Ik ben er nog niet uit hoe ik een html generator kan opzetten per HasMap ObjectKey. Ik kan wel de keys eruit halen in zijn geheel d.m.v. keySet() maar ik wil per index nummer de key eruit halen en de lijst sh. Dus kort gezegd hoe pak ik de breakdown van de HashMap in originele compenenten weer aan om html te genereren?

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 09:10
Je probleem is mij niet erg duidelijk. Probeer je nu alle informatie die je in je HashMap hebt weer terug te halen? Zo ja, wat lukt er dan niet? Zo nee, dan snap ik je probleem niet :P

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 04-05 13:54
offtopic:
leer die vuile string concatenaties af, gebruik StringBuffer oid

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Ik kan de gevens niet 1 voor 1 eruit halen.
Dus van de HashMap de eerste ObjectKey "TD0101" en de bijbehorende lijst eruithalen.
de get() methode werkt alleen als je de ObjectKey kent!
ik wil zoiets doen (de code is niet correct, maar hopelijk geeft het de indruk van wat ik ongeveer wil):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for(int i=0; i<TempHashMap.size(); i++)
{
 html = html + "<tr>";

 String Objectkey = TempHashMap.get(ObjectKey(i)); //eruit halen van de key
 for(Objectkey)
 {
   html = html + "<td>";

   List Objects = TempHasMap.get(Objects(i)); //eruithalen van object lijst
   for(int2=0; i2<Objects.size(); i2++)
   {
      List record = Objects.get(i); //eruit halen van de lijst record
      if(record.item(nr 2).equals("idle"))
      {
        html = html + "bgcolor=red";
      }
     enz.
   }
   html = html + "</td>";
   html = html + "</tr>"
 } 
}

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

er bestaat toch zoiets als een iterator of zo voor hashmaps??

of je kan alle keys er in eens uithalen...

ASSUME makes an ASS out of U and ME


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 09:10
Je kunt inderdaad de inhoud van een HashMap doorlopen.

code:
1
2
3
4
5
Iterator it = TempHashMap.keySet().iterator();
while(it.hasNext())
{
//....
}


Je hebt dan geloof ik geen controle op de volgorde van de items, maar weet ook niet of je dat nodig hebt.

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Volgorde zou wel handig zijn.
De lijst zal uiteindelijk de keys bevatten van parentequipment opgevolgd door de childequipment.

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 09:10
Dan weet ik niet of je wel een HashMap moet gebruiken. Of je moet hem op een andere manier gebruiken. (dat je bijv. keys op volgorde bijhoudt in een ArrayList en die door gaat lopen om gegevens uit de HashMap te halen)

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Daar was ik net ook op gekomen. Inmiddels heb ik de keySet opgeslagen in een lijst en itereer daar doorheen en zoek de bijbehorende object.
Ik denk dat ik op de goede weg ben...Keep you posted on finish ;)

[ Voor 20% gewijzigd door turkosh op 23-05-2005 16:16 ]


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

Voor het behouden van de volgorde is er de LinkedHashMap, je kunt itereren met
Java:
1
2
3
4
5
6
7
// Assuming map = Map<String, String>
for (Iterator iter = map.entrySet().iterator(); iter.hasNext();)
{ 
    Map.Entry entry = (Map.Entry)iter.next();
    String key = (String)entry.getKey();
    String value = (String)entry.getValue();
}

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Ik heb het:
Java:
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
Set l_EqpNames = l_HashList.keySet();
            
            Iterator l_Iter = l_EqpNames.iterator();
            
            while (l_Iter.hasNext()) //iterate on EqpNames 
            {
               l_html = l_html + tr;
               
               String l_HashKey = (String)l_Iter.next();            
               List l_HashObject = (List) l_HashList.get(l_HashKey);
               System.out.println("key " + l_HashKey);
               System.out.println("key list " + l_HashObject);
               
               Iterator l_Iter2 = l_HashObject.iterator();
               
               while (l_Iter2.hasNext()) //iterate on ListofEqpStateHistories
               {
                  String[] l_StateHistory = (String[])l_Iter2.next();
                  System.out.println("StateHistory " + l_StateHistory.toString());
                  
                  for(int i=0; i < l_StateHistory.length; i++) //iterate on 1 EqpStateHistoryRecord
                  {
                     System.out.println("kolom waarde " + l_StateHistory[i].toString());
                  }                                  
               }
            }           


Dit breekt de HashMap List helemaal open. Nu kan ik de html gedeelte ertussen proppen (d.m.v. StringBuffer ;) @Cuball) En gewoon doorgeven aan de jsp. Bedankt voor de hulp.
Er is geen betere forum dan de Tweakers forum :)

Verwijderd

De LinkedHashMap is natuurlijk het makkelijkst omdat ie standaard in java zit. Wil je net even meer, dan kun je ook de ListOrderedMap uit apache commons collections gebruiken. Die heeft oa een get(int) waarmee je directe het Nde element eruit kunt halen.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 07-05 19:18

Robtimus

me Robtimus no like you

Je kunt denk ik beter entrySet() gebruiken ipv keySet() en get(). entrySet() levert nml meteen een set met key-value waarden.
Dus ipv
Java:
1
2
3
4
5
6
7
8
9
Set l_EqpNames = l_HashList.keySet(); 
Iterator l_Iter = l_EqpNames.iterator(); 
while (l_Iter.hasNext()) //iterate on EqpNames  
{ 
    l_html = l_html + tr; 

    String l_HashKey = (String)l_Iter.next();             
    List l_HashObject = (List) l_HashList.get(l_HashKey);
}
gebruik je
Java:
1
2
3
4
5
6
7
8
9
Set l_Entries = l_HashList.entrySet();
Iterator l_Iter = l_Entries.iterator();
while (l_Iter.hasNext())
{
    l_html = l_html + tr;
    Map.Entry l_Entry = (Map.Entry)l_Iter.next();
    String l_HashKey = (String)l_Entry.getKey();
    List l_HashObject = (List)l_Entry.getValue();
}
Als je de key verder niet eens nodig hebt kun je ook l_HashList.values() gebruiken. Deze geeft een Collection terug (type boeit verder niet) met de volgorde gelijk aan de volgorde van de keys, en bevat alleen de values (dus Lists):
Java:
1
2
3
4
5
6
7
Collection l_Values = l_HashList.values();
Iterator l_Iter = l_values.iterator();
while (l_Iter.hasNext())
{
    l_html = l_html + tr;
    List l_HashObject = (List)l_Iter.next();
}

[ Voor 11% gewijzigd door Robtimus op 23-05-2005 19:52 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 07-05 18:32
Cuball schreef op maandag 23 mei 2005 @ 15:04:
offtopic:
leer die vuile string concatenaties af, gebruik StringBuffer oid
Gelukkig weet de compiler dat ook en maakt die er al een StringBuffer van :)

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
@IceManX

Ik heb net de entrySet() geprobeerd. Ik zie geen merkbaar verschil tussen keySet en entrySet. het process tijd is even lang bij allebei en ik krijg de zelfde resultaten, dus beide werken op dit moement even goed ;) .
In de iterator itereer ik in beide gevallen door een Set Type. Het enige verschil hier is dat de ene Set alleen de keys bevat, en de andere eigenlijk de HahMap is (key, value).

Het verschil is dat ik de HashMap functies aanroep (get()) en jij Map(.Entries) functies.

Is de acceptatie van HashMap niet groter dan Map?

Verwijderd

turkosh schreef op dinsdag 24 mei 2005 @ 09:55:
Het verschil is dat ik de HashMap functies aanroep (get()) en jij Map(.Entries) functies.
Waarbij entry set altijd de voorkeur verdient als je zowel de key als de value nodig. get() neemt namelijk nog een bepaalde hoeveelheid tijd in beslag om de value op te halen. Opzich is dit niet veel tijd, maar zonde als je dat ding toch al meteen kan krijgen.

Overigens zou ik de iteratie liever zo schrijven:

Java:
1
2
3
4
5
6
7
Iterator l_Iter = l_HashList.entrySet().iterator();
for ( Iterator l_Iter = l_HashList.entrySet().iterator(); l_Iter.hasNext(); ) {
    Map.Entry l_Entry = (Map.Entry)l_Iter.next();
    String l_HashKey = (String)l_Entry.getKey();
    List l_HashObject = (List)l_Entry.getValue();
    // ...
}


(maar smaken verschillen natuurlijk)


Is de acceptatie van HashMap niet groter dan Map?[/quote]

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 07-05 19:18

Robtimus

me Robtimus no like you

turkosh schreef op dinsdag 24 mei 2005 @ 09:55:
@IceManX

Ik heb net de entrySet() geprobeerd. Ik zie geen merkbaar verschil tussen keySet en entrySet. het process tijd is even lang bij allebei en ik krijg de zelfde resultaten, dus beide werken op dit moement even goed ;) .
In de iterator itereer ik in beide gevallen door een Set Type. Het enige verschil hier is dat de ene Set alleen de keys bevat, en de andere eigenlijk de HahMap is (key, value).

Het verschil is dat ik de HashMap functies aanroep (get()) en jij Map(.Entries) functies.
Alleen is get() trager naarmate je buckets groter worden.
De Java HashMap is nml een array van linked lists, waarbij de hashcodes (in iets aangepaste versie) gebruikt worden als index voor je array. Als je dus veel objecten hebt met dezelfde hashcode dan is get wel degelijk trager dan het ophalen van een enkele waarde van een entry. Omdat jouw dataset relatief klein is merk je er in de praktijk idd weinig van.
Is de acceptatie van HashMap niet groter dan Map?
Wat bedoel je met acceptatie? Een Map is een interface, en HashMap is een class die die interface implementeert. Een Map is dus generieker.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Nu even een vraag in het verlengde van dit topic:

Ik genereer voor elk key uit de HasMap een tabel - dit omdat element a en b niet altijd evenveel/evenbreed kolommen zullen hebben. Anders worden die uitgelijnd in 1 tabel en gaat dat ten koste van de kolombreedte (die de tijds duur moet aangeven).

Na het genereren van de html code krijg ik het volgende te zien:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table border="0" cellspacing="0">
<tr><th width="100px">TD0101</th>
<a href="c:\test1.html"><td bgcolor=green width="250px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=blue width="500px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=yellow width="100px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=red width="50px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=green width="100px" height="20px"></td></a>
</tr><tr/>
</table>
<table border="0" cellspacing="0">
<tr><th width="100px">TD0101A</th>
<a href="c:\test1.html"><td bgcolor=green width="100px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=blue width="100px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=green width="100px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=blue width="100px" height="20px"></td></a>
<a href="c:\test1.html"><td bgcolor=green width="100px" height="20px"></td></a>
</tr><tr/>
</table>


Op de browser venster is de het onderste tabel een stukje verschoven ten op zichte van de bovenste.
Ik heb de th een breedte gegeven van 100px om de text van verschillende afmetingen op te vangen, maar kennelijk werkt dat niet.
Hoe kan ik die 2 tabellen fixeren?

Inmiddels heb ik wat een en ander kunnen uitvissen. Als de som van kolombreedtes groter is dan de <div> kader waar ze in zijn gezet dan gaat het resizen. Dus ik moet in de iteratie zorgen dat de breedtes aangepast worden zodat het altijd kleiner of gelijk is aan <div> breedte.....

[ Voor 32% gewijzigd door turkosh op 24-05-2005 14:49 ]

Pagina: 1