|
You last visited: Today at 11:01
Advertisement
Kleines Problem mit Listen und Maps
Discussion on Kleines Problem mit Listen und Maps within the Java forum part of the Coders Den category.
06/14/2016, 15:56
|
#1
|
elite*gold: 0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
|
Kleines Problem mit Listen und Maps
Nabend Dudes,
wie im Titel bereits erwähnt, habe ich ein kleines Problem. Und zwar möchte ich Wörter aus einer Liste ziehen und sie dementsprechend in einer anderen Liste ihrer Wortlänge (Schlüssel als Integer) in einer Map zuweisen.
Nur leider kriege ich nicht das gewünschte Ergebnis. Sobald ich dem Wert eine Liste zuweise, die Liste dann zurrücksetze, wird der Eintrag in der Map ebenfalls zurückgesetzt. Aber das scheint mir unschlüssig, da ich dem Schlüssel die Liste ja bereits zuweise, bevor ich die Liste leere.
Code:
public HashMap mapList(List<String> o) {
HashMap<Integer, List<String>> m = new HashMap<>();
ListIterator lt = o.listIterator();
List<String> lng = new ArrayList<>();
for (int i = o.get(0).length(); i <= o.get(o.size() - 1).length(); i++) { // i = 3; i <= 10
lng.clear();
for (int j = 0; j <= o.size()- 1; j++) {
if (lt.hasNext()) {
//if (lt.next().toString().length() == i) {
if (o.get(j).length() == i) {
lng.add(o.get(j));
} else if (o.get(j).length() >= i) {
break;
}
//}
}
}
System.out.println(lng);
List<String> w = lng;
m.put(i, w);
System.out.println(m);
System.out.println(i);
}
return m;
}
Code:
[Jon, Ser]
{3=[Jon, Ser]}
3
[Robb, Bran, Arya, Azor, Ahai]
{3=[Jon, Ser], 4=[Robb, Bran, Arya, Azor, Ahai]}
4
[Sansa, Jaime, Davos, Aerys, Aegon, Stark]
{3=[Jon, Ser], 4=[Robb, Bran, Arya, Azor, Ahai], 5=[Sansa, Jaime, Davos, Aerys, Aegon, Stark]}
5
usw...
Code:
[Jon, Ser]
{3=[Jon, Ser]}
3
[Robb, Bran, Arya, Azor, Ahai]
{3=[Robb, Bran, Arya, Azor, Ahai], 4=[Robb, Bran, Arya, Azor, Ahai]}
4
[Sansa, Jaime, Davos, Aerys, Aegon, Stark]
{3=[Sansa, Jaime, Davos, Aerys, Aegon, Stark], 4=[Sansa, Jaime, Davos, Aerys, Aegon, Stark], 5=[Sansa, Jaime, Davos, Aerys, Aegon, Stark]}
5
usw...
Ich hoffe ich drücke mich nicht all zu undeutlich aus, und ihr versteht das Problem. Als Parameter wird eine stumpfe String-List aus Wörtern übergeben. Ich fange grad an Java zu lernen und wollte mich ein wenig mit den Collections auseinandersetzen.
Würde mich über einen kleinen Denkanstoß freuen, da ich mich in das Problem verwickelt habe und gar nicht mehr so ganz weiß, was ich überhaupt schon alles probiert habe.
Cheers
|
|
|
06/14/2016, 16:33
|
#2
|
elite*gold: 0
Join Date: Jul 2009
Posts: 3,441
Received Thanks: 1,473
|
Ich muss gestehen ich verstehe deinen Code nicht wirklich (kann auch daran liegen, dass ich grade von der Uni komme und mich noch nicht konzentrieren kann  ).
Aber sowas wäre mein Vorschlag:
Code:
public HashMap mapList2(List<String> o) {
HashMap<Integer, List<String>> m = new HashMap<>();
for (String element : o) {
List<String> subList = m.get(element.length());
if(subList==null){
m.put(element.length(), new ArrayList<>(Arrays.asList(element)));
}else{
m.get(element.length()).add(element);
}
}
System.out.println(m);
return m;
}
Du läufst über deine Strings in der übergebenen Liste. Als nächstes lässt du dir das Element aus der Map geben, das als Key die Länge des aktuellen Strings hat.
Falls diese Liste schon existiert, fügst du einfach den String hinzu, ansonsten legst du eine neue Liste mit dem String an.
#Okay hab mir deinen Code nochmal angeguckt:
Wenn du deine Liste in die Map hinzufügst, dann wird keine Kopie der Liste angelegt. Soll heißen, wenn du die Liste danach leerst, dann ist das die gleiche Liste die auch in der Map ist. Diese wird also auch geleert.
Was du willst ist eine "deep copy" der Liste, die du dann hinzufügst:
Code:
public HashMap mapList(List<String> o) {
HashMap<Integer, List<String>> m = new HashMap<>();
ListIterator lt = o.listIterator();
List<String> lng = new ArrayList<>();
for (int i = o.get(0).length(); i <= o.get(o.size() - 1).length(); i++) { // i = 3; i <= 10
lng.clear();
for (int j = 0; j <= o.size() - 1; j++) {
if (lt.hasNext()) {
//if (lt.next().toString().length() == i) {
if (o.get(j).length() == i) {
lng.add(o.get(j));
} else if (o.get(j).length() >= i) {
break;
}
//}
}
}
System.out.println(lng);
List<String> w = lng;
//hier eine deep-copy erstellen.
List<String> copy = new ArrayList<>();
for(String s : lng){
copy.add(s);
}
m.put(i, copy);
System.out.println(m);
System.out.println(i);
}
return m;
}
Um das nochmal deutlich zu machen:
Code:
Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>(Arrays.asList("A", "AB", "ABC"));
map.put("a", list);
System.out.println(list==map.get("a"));
"list" und die zurückgegeben Liste von "map.get("a")" verweisen beide auf die gleiche Liste. Es wird keine Kopie der Liste in die Map gesteckt oder Ähnliches.
|
|
|
06/14/2016, 19:03
|
#3
|
elite*gold: 0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
|
Quote:
Originally Posted by Belur
Ich muss gestehen ich verstehe deinen Code nicht wirklich (kann auch daran liegen, dass ich grade von der Uni komme und mich noch nicht konzentrieren kann  ).
Aber sowas wäre mein Vorschlag:
Code:
public HashMap mapList2(List<String> o) {
HashMap<Integer, List<String>> m = new HashMap<>();
for (String element : o) {
List<String> subList = m.get(element.length());
if(subList==null){
m.put(element.length(), new ArrayList<>(Arrays.asList(element)));
}else{
m.get(element.length()).add(element);
}
}
System.out.println(m);
return m;
}
Du läufst über deine Strings in der übergebenen Liste. Als nächstes lässt du dir das Element aus der Map geben, das als Key die Länge des aktuellen Strings hat.
Falls diese Liste schon existiert, fügst du einfach den String hinzu, ansonsten legst du eine neue Liste mit dem String an.
#Okay hab mir deinen Code nochmal angeguckt:
Wenn du deine Liste in die Map hinzufügst, dann wird keine Kopie der Liste angelegt. Soll heißen, wenn du die Liste danach leerst, dann ist das die gleiche Liste die auch in der Map ist. Diese wird also auch geleert.
Was du willst ist eine "deep copy" der Liste, die du dann hinzufügst:
Code:
public HashMap mapList(List<String> o) {
HashMap<Integer, List<String>> m = new HashMap<>();
ListIterator lt = o.listIterator();
List<String> lng = new ArrayList<>();
for (int i = o.get(0).length(); i <= o.get(o.size() - 1).length(); i++) { // i = 3; i <= 10
lng.clear();
for (int j = 0; j <= o.size() - 1; j++) {
if (lt.hasNext()) {
//if (lt.next().toString().length() == i) {
if (o.get(j).length() == i) {
lng.add(o.get(j));
} else if (o.get(j).length() >= i) {
break;
}
//}
}
}
System.out.println(lng);
List<String> w = lng;
//hier eine deep-copy erstellen.
List<String> copy = new ArrayList<>();
for(String s : lng){
copy.add(s);
}
m.put(i, copy);
System.out.println(m);
System.out.println(i);
}
return m;
}
Um das nochmal deutlich zu machen:
Code:
Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>(Arrays.asList("A", "AB", "ABC"));
map.put("a", list);
System.out.println(list==map.get("a"));
"list" und die zurückgegeben Liste von "map.get("a")" verweisen beide auf die gleiche Liste. Es wird keine Kopie der Liste in die Map gesteckt oder Ähnliches.
|
Vielen lieben Dank! Das ist genau die Lösung und das wonach ich gesucht habe.
Cheers
|
|
|
06/17/2016, 01:02
|
#4
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,403
|
Fand die Lösung vom Vorposter zu kompliziert.
Code:
Map<Integer, List<String>> map = new HashMap<>();
List<String> target = Arrays.asList("Sansa", "Jaime", "Davos", "Aerys", "Aegon", "Stark", "Jon", "Ser");
for(String s : target) {
List<String> value = map.getOrDefault(s.length(), new ArrayList<String>());
map.put(s.length(), value);
value.add(s);
}
Entry<Integer, List<String>> e;
for(Iterator<Entry<Integer, List<String>>> it = map.entrySet().iterator(); it.hasNext(); ) {
e = it.next();
System.out.println(e.getKey() + " " + e.getValue());
}
Viel Spaß mit dem Denkanstoß
|
|
|
06/18/2016, 05:26
|
#5
|
dotCom
elite*gold: 9842
Join Date: Mar 2009
Posts: 16,843
Received Thanks: 4,675
|
#problem solved
|
|
|
Similar Threads
|
Problem mit Listen
02/19/2012 - C/C++ - 3 Replies
Hi Leute.
Ich habe ein Problem mit dem Abspeichern und dem Aufrufen von einer Liste aus einer externen Datei.
Wenn ich erst abspeicher und direkt wieder lade ohne das Programm vorher zu schließen funktioniert alles reibungslos.
Wenn ich aber die Liste erst abspeicher, das Programm schließe, neu starte und dann versuche die Liste wieder zu laden stürzt das Programm entweder ab oder ich bekomme nur Teile des Abgespeicherten wieder.
Ich hoffe jemand von euch kann mir helfen :)
Meine...
|
All times are GMT +1. The time now is 11:02.
|
|