Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 11:01

  • Please register to post and access all features, it's quick, easy and FREE!

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.

Closed Thread
 
Old   #1
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Exclamation 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.




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
exceble is offline  
Old 06/14/2016, 16:33   #2
 
Belur's Avatar
 
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.
Belur is offline  
Thanks
1 User
Old 06/14/2016, 19:03   #3
 
exceble's Avatar
 
elite*gold: 0
The Black Market: 166/0/0
Join Date: Jul 2012
Posts: 2,327
Received Thanks: 604
Quote:
Originally Posted by Belur View Post
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
exceble is offline  
Old 06/17/2016, 01:02   #4
 
Achat's Avatar
 
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ß
Achat is offline  
Thanks
1 User
Old 06/18/2016, 05:26   #5
dotCom
 
Devsome's Avatar
 
elite*gold: 9842
The Black Market: 107/0/0
Join Date: Mar 2009
Posts: 16,843
Received Thanks: 4,675
#problem solved
Devsome is offline  
Closed Thread


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.