Hier arbeitet man doch mit Collections... Warum dieses "for"-Konstrukt?
Java:
Map<String,Set<String>> from =...Map<String,List<String>>to=newHashMap<String,List<String>>();Iterator<Map.Entry<String,Set<String>> i = from.entrySet.iterator();Map.Entry<String,Set<String> entry;while(i.hasNext()){
entry = i.next();to.put(entry.getKey(),newArrayList<String>>(entry.getValue()));}
All Right... Hab's inzwischen nach gelesen. Ganz beiläufig auch noch erfahren, dass Arrays in diesem For-Each-Konstrukt vermieden werden sollten. Der Grund: Arrays werden in eine List geboxt, was (zusätzlich zu anderen nachteiligen Nebeneffekten) recht unperformant ist. Also: nicht für Unklug...
Hier arbeitet man doch mit Collections... Warum dieses "for"-Konstrukt?
Java:
Map<String,Set<String>> from =...Map<String,List<String>>to=newHashMap<String,List<String>>();Iterator<Map.Entry<String,Set<String>> i = from.entrySet.iterator();Map.Entry<String,Set<String> entry;while(i.hasNext()){
entry = i.next();to.put(entry.getKey(),newArrayList<String>>(entry.getValue()));}
Das Hauptproblem, was ich mit diesem Stil habe, ist nicht die Zeile mehr: Der Iterator ist außerhalb der Schleife sichtbar, und das ist schlecht. Ich habe viel mit älterem Code zu tun, der genau so geschreiben ist (außer dass die Iteratoren nicht generisch sind, was das Problem noch vergrößert), und ich habe in einigen Fällen Bugs gefunden, die auf der versehentlichen "Wiederverwendung" des Iterators in der nächsten Schleife beruhten. Da braucht man ein Mikroskop und viel Geduld, um endlich irgendwann darauf zu kommen, dass ein iter2 eigentlich ein iter3 sein sollte oder so...
Es gibt auch noch die Variante, wo der Iterator in einer for-Schleife erzeugt und "getaktet" wird - das ist schon ein wenig besser.
Das Hauptproblem, was ich mit diesem Stil habe, ist nicht die Zeile mehr: Der Iterator ist außerhalb der Schleife sichtbar, und das ist schlecht. Ich habe viel mit älterem Code zu tun, der genau so geschreiben ist (außer dass die Iteratoren nicht generisch sind, was das Problem noch vergrößert), und ich habe in einigen Fällen Bugs gefunden, die auf der versehentlichen "Wiederverwendung" des Iterators in der nächsten Schleife beruhten. Da braucht man ein Mikroskop und viel Geduld, um endlich irgendwann darauf zu kommen, dass ein iter2 eigentlich ein iter3 sein sollte oder so...
Es gibt auch noch die Variante, wo der Iterator in einer for-Schleife erzeugt und "getaktet" wird - das ist schon ein wenig besser.
Leider werden schleifen oft per C&P "wiederverwendet", je mehr Abhängigkeiten zum Kontext der Schleife existieren, umso mehr Möglichkeiten gibt es Fehler einzuschleusen.
Eine for Schleife hat den Vorteil, das oft (nicht immer) alle Abhängigkeiten der Schleife selbst im Schleifenkopf deklariert und initialisiert sind.