2017-02-12 3 views
3

Ich versuche, diesen folgenden Code zu tun:Converting Kollektionen mit Sammlungen

Map<Node, TreeSet<String>> childrenNodes = new TreeMap<>(getAll()); 

I getAllNodesAndEdges Methode Header unten setzen:

public Map<Node, Set<String>> getAll() {...} 

Ich brauche eine Übersichtskarte und die Menge in der es zu konvertieren in beide und TreeSet für sortierten Druck. Das erste Stück Code hat jedoch einen Kompilierungsfehler, der besagt: "Cannot infer type arguments for TreeMap<>"

Was ist der beste Weg, um das zu beheben?

Edit: weitere Informationen unter

In Information.java:

public Map<Node, Set<String>> getAll() { 
     return this.all; 
} 

jedoch test1.java Bedürfnisse verwenden Sie den Code

Map<Node, HashSet<String>> all = getAll() 

und test2.java braucht den Code zu verwenden

Map<Node, TreeSet<String>> childrenNodes = new TreeMap<Node, TreeSet<String>>(getAll()); 

aber beide Typenkonflikt Lauf kompilieren Fehler

die erste:

Type mismatch: cannot convert from Map<Node,Set<String>> to Map<Node,HashSet<String>> 

die zweite:

The construtor TreeMap<Node,TreeSet<String>>(Map<Node,Set<String>>) is undefined 
+0

Sie Typ Argumente brauchen innerhalb '<>'. Sie können nicht automatisch abgeleitet werden, so wie der Fehler –

+0

lautet. Oder Sie können 'getAll' veranlassen, eine TreeMap selbst zurückzugeben. –

+0

@ cricket_007 Wie würde ich das machen? – Michael

Antwort

2

Sie müssen neue Objekte für die neuen Kartenwerte erstellen.

Map<Node, TreeSet<String>> converted = new TreeMap<>(); 

for(Entry<Node, Set<String>> entry : childrenNodes.entrySet()){ 
    converted.put(entry.getKey(), new TreeSet<>(entry.getValue())); 
} 
+0

Ich entschied mich für diese Lösung, weil sie am besten für meine Implementierung war, danke – Michael

0

Sie können dies in einer solchen Art und Weise nicht.

Sie können entweder tun:

1) Änderung Variablentyp childrenNodes:

Map<Node, Set<String>> childrenNodes = new TreeMap<>(getAll()); 

dh nicht Map<Node, TreeSet<String>>, aber Map<Node, Set<String>>

entweder

2) machen getAll() Rückgabetyp

Map<Node, TreeSet<String>> getAll() 

Der Fehler der Compiler sagt Ihnen genau diese Sache: es ist unmöglich, infer TreeSet<String> von Set<String>. Es ist grob gesagt das gleiche wie versuchen, eine solche Art der Zuordnung: HashMap<String> foo = getMap(); wo getMap() einfach Map<String> zurückgibt.

+0

Mein Dilemma ist, ich brauche childrenNodes zu einer Map > wegen seiner Notwendigkeit für sortierte Strings. Manchmal muss der zurückgegebene Wert jedoch auf Map > festgelegt werden. Also, wenn es keine Möglichkeit gibt, dies zu tun, ist es am besten, eine andere Methode zu erstellen, eine, die TreeSet zurückgibt, eine, die Hash zurückgibt? – Michael

+0

Richtig, du kannst so etwas nicht machen. Es mag sagen: Ich will Variable durch 'Karte ', aber einige Zeit setzen dort ganzzahlige Werte. Eigentlich kann man das *, aber man vergisst Typenvariablen und verwendet rohe Typen. Oder verwenden Sie den meisten Basistyp (in Ihrem Fall ist es Set '). – Andremoniy

+0

@PatrickParker Entschuldigung, für wen werden diese Nachrichten adressiert? Für mich oder für Michael? – Andremoniy

0

Sie können nicht einfach einen Typ von Set (TreeSet, HashSet) in einen anderen umwandeln. Sie müssen einen Lieferanten übergeben, z.TreeSet::new, über Methodenparameter.

private final Map<Node, Set<String>> all; 

public <S extends Set<String>, M extends Map<Node, S>> M getAll(Supplier<M> mapFactory, Supplier<S> setFactory) { 
    return all.entrySet().stream() 
     .collect(Collectors.toMap(
      Map.Entry::getKey, 
      e -> e.getValue().stream().collect(Collectors.toCollection(setFactory)), 
      (v1, v2) -> v1, 
      mapFactory)); 
} 

Dann würden Sie es so nennen:

Map<Node, HashSet<String>> test1 = getAll(HashMap::new, HashSet::new); 
Map<Node, TreeSet<String>> test2 = getAll(TreeMap::new, TreeSet::new); 

Oder noch besser, verwenden Sie die Sorted-Schnittstellen statt Implementierungsklassen für die lokale Variablentyp:

Map<Node, Set<String>> test1 = getAll(HashMap::new, HashSet::new); 
SortedMap<Node, SortedSet<String>> test2 = getAll(TreeMap::new, TreeSet::new); 
Verwandte Themen