# ArrayList in HashMap?



## Th_C (9. Jul 2007)

Hallo,

habe folgendes Problem:
Ich habe einmal in einer ArrayList Werte gespeichert und das andere mal dieselben Werte in einer HashMap. Diese muss ich nun vergleichen und möchte die Werte aus der ArrayList in eine HashMap eintragen.
Aber wie?
Habe schon versucht mit einer Schleife über die ArrayList zu laufen und durch put und get-Methoden die Werte irgendwie in die HashMap zu bekommen...klappt aber nicht 

Was gibt es da für Möglichkeiten?

Danke im Vorraus


----------



## madboy (9. Jul 2007)

> Ich habe einmal in einer ArrayList Werte gespeichert und das andere mal dieselben Werte in einer HashMap. Diese muss ich nun vergleichen und möchte die Werte aus der ArrayList in eine HashMap eintragen.


Willst du nun vergleichen, sind die Werte schon gleich oder willst du eintragen?
Wenn die Einträge in Map und List schon gleich sind, erübrigt sich doch alles andere ???:L


----------



## Gelöschtes Mitglied 5909 (9. Jul 2007)

mit nem keyset über die map iterieren


----------



## Leroy42 (9. Jul 2007)

Jede Map hat doch (key,value)-Paare.
Unter welchen Keys willst du denn die Werte in
der HashMap speichern?


----------



## Th_C (10. Jul 2007)

sorry, war etwas ungeschickt ausgedrückt:

In Array-List habe ich Werte aus einem xml-Dokument ausgelesen.
Und in der Hash-Map habe ich SChlüssel und Werte aus einer Properties-geladen (es ist auch keine richtige Hash-Map sondern ein Objekt der Klasse Properties, die ja von Hash-Map abgeleitet ist, daher spielt das ja eigentlich keine Rolle).

Ich weiß nicht ob alle Properties-Dateien so aufgebaut sind, aber bei der mit der ich arbeite ist in jeder Zeile ein der Schlüssel, dann folgt ein '=' und dann kommt der Wert.
Diese Werte will ich nun mit denen aus dem xml-Dokument (sind jetzt in der ArrayList) vergleichen und dazu muss ich die Werte aus der ArrayList in eine HashMap bekommen. Oder irre ich mich?

Gruß, Thomas


----------



## Th_C (10. Jul 2007)

Die Werte aus der HashMap, sollten also mit denen aus der ArrayList übereinstimmen und das muss ich überprüfen
(sorry für zweimaliges posten)


----------



## SlaterB (10. Jul 2007)

das macht in keinster Weise Sinn,
eine Map enthält Schlüssel-Werte-Paare, für
auto=opel
also "auto" -> "opel"

wie kannst du nun circa 70x sagen, dass in der ArrayList der gleiche 'Wert' enthalten ist?
was denn genau??
ein String "auto=opel"
oder nur der key oder nur der value oder wie?


in jedem Fall gilt:
wenn du die ArrayList-Werte in die Map speicherst hast du es auch nicht unbedingt leichter mit dem vergleichen,
gehe so vor:
1.)
durchlaufe die ArrayList und prüfe für jeden 'Wert', ob er auch in der Map enthalten ist
2)
durchlaufe die Map und prüfe für jeden 'Wert (Wert-Paar?)', ob er/ es auch in der Liste enthalten ist

ok, bei einer großen Liste wäre das prüfen auf Enthaltensein in der Liste nicht sehr performant,
aus diesem Grunde wäre es tatsächlich ratsam, den Inhalt der ArrayList zum schnelleren Zugriff in einer Map zu speichern


----------



## mikachu (10. Jul 2007)

```
public static <T> boolean isEqual( HashMap<Integer, T> hashmap, ArrayList<T> list )
{
   if( hashmap.size() != list.size() ) return false;

   Iterator<T> hmIt = hashmap.values().iterator();
   Iterator<T> liIt = list.iterator();

   while( hmIt.hasNext() )
   {
      if( !hmIt.next().equals( liIt.next() ) )
         return false;
   }

   return true;
}
```

#untested#


----------



## Guest (10. Jul 2007)

es geht mir nur um den Wert (value).
Diese sollten halt mit den Einträgen aus der ArrayList übereinstimmen.

Ich entwickle das Projekt nur weiter. Als ich damit angefangen hab waren die Werte aus bestimmte xml-Dokumente bereits in der Array-List.
Außerdem waren zwei Objekte der Klasse Properties anglegt (myProperties und compareProperties).
In myProperties stehen nun die Strings aus der Properties-Datei.
Und ich soll die Werte aus den xml-Dokumenten in das Objekt compareProperties stecken.

Dann sollen myProperties und compareProperties verglichen werden


----------



## SlaterB (10. Jul 2007)

@ mika.fhdw:
richtige Reihenfolge ist wohl vorausgesetzt, was? 

aber das geht schon in die richtige Richtung, 
vielleicht noch als Liste sortieren,

oder nur einen Iterator durchlaufen und mit contains beim anderen prüfen,
dann muss man noch überlegen, inwieweit Doppelte berücksichtig werden sollen


----------



## mikachu (10. Jul 2007)

Th_C hat gesagt.:
			
		

> Hallo,
> 
> habe folgendes Problem:
> Ich habe einmal in einer ArrayList Werte gespeichert und das andere mal dieselben Werte in einer HashMap. Diese muss ich nun vergleichen und möchte die Werte aus der ArrayList in eine HashMap eintragen...



Ich hab einfach vorausgesetzt, dass die in der gleichen reihenfolge sind 
wenn es noch anders sein soll, kann man das ja leicht modifizieren  :wink:

#edit 1
das ist meine lösung, da aus der aufgabe oder frage nicht herausging, ob die reihenfolge eine rolle spielt.
das lieb ich ja immer so an den ganzen fragen/aufgabenstellungen... schwammig, unvollständig... da kann man nicht ne vollständige lösung erwarten 

#edit 2
überarbeitete version für SlaterB 
ohne rücksicht auf doppelte einträge :noe: 

```
public static <T> boolean isEqual( HashMap<Integer, T> hashmap, ArrayList<T> list )
{
//   if( hashmap.size() != list.size() ) return false; // kann man sich jez auch sparen

   Iterator<T> hmIt = hashmap.values().iterator();
//      Iterator<T> liIt = list.iterator();

   while( hmIt.hasNext() )
   {
//         if( !hmIt.next().equals( liIt.next() ) )
//            return false;
      if( !list.contains( hmIt.next() ) )
         return false;
   }

   return true;
}
```


----------



## Th_C (10. Jul 2007)

mika.fhdw hat gesagt.:
			
		

> das lieb ich ja immer so an den ganzen fragen/aufgabenstellungen... schwammig, unvollständig... da kann man nicht ne vollständige lösung erwarten



Das hier ist nicht umsonst das Anfängerforum 
Trotzdem danke erstmal für die Lösungsvorschläge.

Aber was bedeuten die <T>s in deinem Quellcode?
Und warum verneinst du: 
	
	
	
	





```
!list.contains( hmIt.next()
```
  ?? 


```
if( !list.contains( hmIt.next() ) ) 
         return false;
```


----------



## mikachu (10. Jul 2007)

Th_C hat gesagt.:
			
		

> Aber was bedeuten die <T>s in deinem Quellcode?


das sind Schablonen für verschiedene Typen von Objekten. Damit du nicht, wenn du mal eine Liste mit Strings und das andere mal eine Liste mit Integers erhälst, die immer neu schreiben musst...



			
				Th_C hat gesagt.:
			
		

> Und warum verneinst du:
> 
> 
> 
> ...



naja, lies mal:
"wenn list das nächste element aus der hashmap *nicht* erhält, gib false zurück"


----------



## SlaterB (10. Jul 2007)

> Ich hab einfach vorausgesetzt, dass die in der gleichen reihenfolge sind 

das ist ja keine Kritik sondern die lustige Form des Hinweises
'die Reihenfolge von map.values.iterator() ist undefiniert'
wobei ich allerdings nie getestet habe, obs nicht vielleicht die Einfügereihenfolge ist


----------



## mikachu (10. Jul 2007)

ach das meinst du 

ob die so angeordnet sind, wie die reingingen, weiß ich auch nicht... ich weiß nur, dass das so bei sämtlichen queue's und beim vector ist -> fifo-prinzip


----------



## Th_C (10. Jul 2007)

ich glaube es ist aber besser die Werte in meiner ArrayList in einer Hashmap, bzw. in einem Objekt der Klasse Properties zu speichern?!

Das Programm braucht ne Ewigkeit beim ausführen.

Kann mir vielleicht noch jemand helfen? 

DAnke


----------



## mikachu (10. Jul 2007)

Th_C hat gesagt.:
			
		

> Kann mir vielleicht *noch* jemand helfen?



selber coden macht schlau... die hinweise, und wie es geht, hast du ja daliegen, mussu dich nur mal selber ransetzten und dir die finger wund hauen auffer tasta :lol:


----------



## SlaterB (10. Jul 2007)

"ich mache irgendwas und bin noch nicht zufrieden,
ich helfe aber nicht bei der Sache sondern frage einfach mal nach blinden weiteren Lösungen unter denen ich mir dann eine aussuche"


----------



## Th_C (13. Jul 2007)

moin, 

es gab eine kleiner Änderung im Programm. 
Die Liste und die HashMap wurden erhalten. 
In der Liste sind die nun die Werte aus der XML-Datei und in der Hashmap sind Keys aus einer Properties Datei geladen wurden. (Value ist momentan null). 

Die Einträge in der Liste sollten mit den Keys aus der HashMap übereinstimmen. 
Nun muss ich diese halt vergleichen. Meine Idee: 


```
Iterator It1 = placeholderList.iterator (); 
Iterator It2 = compareProperties.keySet ().iterator (); 

while (It2.hasNext ()) { 
  if (placeholderList.contains (It2.next())) { 
        System.out.println ("richtig"); 
        if (It1.hasNext ()) { 
                  It1.next (); 
        } 
        } else { 
        if (It1.hasNext ()) { 
                System.out.println (It1.next () + "   falsch"); 
        } 
  } 
}
```

Syntaktisch auch kein Problem. Allerdings werden auf der Konsole alle Werte des It1 ausgegben mit einem "falsch" dahinter. Obwohl ich mir sicher bin, dass einige Einträge aus der Liste mit denen der HashMap übereinstimmen. 
Woran kann das liegen?? 

Und nochwas: Die gefunden übereinstimmenden Werte sollen in eine Entry-Klasse angelegt werden: 

[/code]                while (It2.hasNext ()) { 
                        //System.out.println (It1.next ()); 
                        if (placeholderList.contains (It2.next())) { 
                                System.out.println ("richtig"); 
                                if (It1.hasNext ()) { 
                                        It1.next (); 
                                } 
                        } else { 
                                if (It1.hasNext ()) { 
                                        System.out.println (It1.next () + "   falsch"); 
                                } 
                        } 
                }
	
	
	
	





```
Wofür ist eine solche Entry-Klasse und wie funktioniert sie???  

Danke
```


----------



## SlaterB (13. Jul 2007)

ich weiß nicht wie es den anderen geht, aber ich sehe zwischen Maps, Listen, Properties und nun auch noch seltsamen 'Entry-Klassen' nicht durch,

fang doch mal an, Schritt für Schritt zu erklären, worum es überhaupt geht

---------
und dass du nicht verstehst, warum 
placeholderList.contains (It2.next())) 
immer false ergibt ohne weiter nachzuforschen, ist nicht zu akzeptieren,

gib doch mal alle Werte von placeholder sowie den Wert It2.next() aus,
dann ist es doch offensichtlich was wo übereinstimmt oder nicht...,

und wie überall: fange mit kleinen Listen/ Maps mit 2-3 Einträgen an,
poste hier nicht hundert Werte


----------



## Th_C (13. Jul 2007)

also die Werte von placeholderList sowie von It2.next() habe ich schon ausgegeben.
Es gibt definitv übereinstimmende Einträge. Deswegen blick ich ja selbst nicht durch 

Ok, ich fang dann mal an etwas über die Geschichte des Programms zu erzählen 

Das Programm wurde von meinem Kollegen aus dem 1 Lj angefangen und ich soll es nun fertigstellen.

Der Kollege hatte die Aufgabe aus verschiedenen xml-Dokumenten alle Strings rauszuschneiden, die zwischen zwei geschweiften Klammern stehen (mit JDOM und SAX gelöst).
Die Strings zwischen { und } sind in der Liste placeholderList.

Meine Entwicklungen:
Ich hatte einer .properties Datei. Diese Datei ist wie eine HashMap aufgebaut. Für jeden Key gibts hinter einem '=' ein value. Diese Datei habe ich nun in ein Objekt der Klasse Properties geladen (Properties wird von HashMap abgeleitet).
Die Keys des Properties-Objekt muss ich nun mit den Einträge aus der Liste placeholderList vergleichen. Mein Versuch:


```
Iterator It1 = placeholderList.iterator (); 
Iterator It2 = compareProperties.keySet ().iterator (); 

while (It2.hasNext ()) { 
  if (placeholderList.contains (It2.next())) { 
        System.out.println ("richtig"); 
        if (It1.hasNext ()) { 
                  It1.next (); 
        } 
        } else { 
        if (It1.hasNext ()) { 
                System.out.println (It1.next () + "   falsch"); 
        } 
  } 
}
```

Obwohl es definitv gleiche Werte gibt, wird immer nur das im else-Zweig ausgeführ, also 
	
	
	
	





```
System.out.println (It1.next () + "   falsch");
```

Aber warum??


Zu der Entry-Klasse:


```
private static class Entry {

		Entry(String placeholder, File file) {
			this.placeholder = placeholder;
			this.file = file;
		}

		private String placeholder;
		private String value;
		private File file;

		public String toString () {
			return placeholder; // + "=" + value;
		}
	}
```

Diese hat mein Ausbilder angelegt und gesagt ich soll mich im Internet darüber informieren. Ich konnte aber nichts brauchbares finden.
Die übereinstimmenden Werte aus placeholderList und It2.next() soll ich in diese Entry-Klasse stecken (wenn denn endlich mal übereinstimmende Werte vom ersten Code-Beispiel zurückgegeben werden )
Aber ich weiß nicht was diese Entry-Klasse macht und wofür sie gut ist.

Vielleicht kann mir ja nun jemadn weiterhelfen  :lol: 

Danke


----------



## SlaterB (13. Jul 2007)

zuviel Info ist meist besser als zuwenig
aber Xml, JDom, Sax, .properties usw. sind Banane,
bitte nur beim Thema bleiben und vor allem kleine Ausschnitte betrachen

a la
"Hier ist Liste placeholder mit Werten x,y,
Properties-Objekt compareProperties mit y,z und folgender Code"
woher das alles kommt oder hingeht interessiert nicht

-------------

'static class' gibts in Java nicht ...

----------

> Obwohl es definitv gleiche Werte gibt

> Aber warum?? 

super, nix gelernt,
immer noch nicht die Werte ausgegeben,
inzwischen kann man sogar bezweifeln, ob sie überhaupt den gleichen Typ haben,
was ist denn da drin, String, Entry-Objekte, ...? ist überhaupt equals definiert?

Ausgabe!

und wenn du immer noch nicht überzeugt bist, dann vergleiche Wert um Wert:

```
Wert vergleich = ..;
for (int i=0; i<list.length; i++) {
  Wert wertInListe = liste.get(i);
  // Klassen der beiden Objekte ausgeben, mit equals vergleichen
  // bei String zeichenweise vergleichen, bytes ausgeben usw.
}
```


----------



## WeirdAl (13. Jul 2007)

SlaterB hat gesagt.:
			
		

> -------------
> 'static class' gibts in Java nicht ...
> ----------


Gibt es schon, aber nur als Innere Klasse. Daher denke ich mal TH_C hat zusammenhanglos aus einer anderen Klasse die Entry Klasse rauskopiert.

@TH_C: Wie schon SlaterB gesagt hat, gib die Werte aus oder debugge doch einfach mal deinen Code und schau Dir genau an was du genau wie vergleichst. Damit findest Du sicher schnell dein Problem.

Cu
Alex


----------

