2016-11-08 6 views
-2

Ich habe zwei Karten mit unterschiedlicher Größe. Zum BeispielWie kann ich zwei Karten unterschiedlicher Größe vergleichen

Map<String, Double> qm3 = new HashMap<>(); 
Map<String, Double> m = new HashMap<>(); 

QM3 hat folgende Karte {d=0.2, e=0.3}

m Die folgende Karte {e=0.3, c=0.4, d=0.5}

Nun hat, wie ich die Schlüssel dieser beiden Karten vergleichen möchten. Wenn der erste Schlüssel von "qm3" mit irgendeinem der Schlüssel von "m" übereinstimmt, dann möchte ich die Werte von qm3 in einer Liste qvec und die Werte von m in einer anderen Liste dvec speichern. und so weiter

Ich möchte jeden Schlüssel von qm3 (d, e) mit jedem Schlüssel von m (e, c, d) übereinstimmen. Zum Beispiel wird d mit e, c, d verglichen. Wenn Übereinstimmung gefunden wird, dann werde ich die Werte von d in zwei Listen setzen.

qvec speichert die im Wert von d aus QM3 und dvec speichert den Wert von d von m

Der Code, den ich bis jetzt haben.

for(Map.Entry<String, Double> qe : qm3.entrySet()){ 
    for(Map.Entry<String, Double> de : m3.entrySet()){ 
     System.out.println(qe.getKey()); 
     if(qe.getKey().equals(de.getKey())){ 
      //System.out.println(qe.getKey()); 
      qvec.add(qe.getValue()); 
      dvec.add(de.getValue()); 
     } 
     else { 
      qvec.add(qe.getValue()); 
      dvec.add(0.0); 
     } 
    } 
} 
+2

Ist Ihnen bekannt, dass 'Map's eine [Lookup-Funktion] haben (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#get-java.lang. Object-), um den Wert zu erhalten, wenn es eine Zuordnung gibt, die es überflüssig macht, über die gesamte Map zu iterieren? – Holger

+0

Warum verwendest du nicht? Dieser Code ist irgendwie undurchdringlich, was ist ein 'qvec'? – Taylor

+0

Oh nein, ich bin nicht vertraut mit diesen Ding, wie man das benutzt oder was ist diese Nachschlagefunktion? –

Antwort

0
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class NewClass2 { 

    public static void main(String[] args) { 
     Map<String, Double> qm3 = new HashMap<>(); 
     qm3.put("d", 0.2); 
     qm3.put("e", 0.3); 
     qm3.put("a", 0.8); 
     Map<String, Double> m = new HashMap<>(); 
     m.put("e", 0.3); 
     m.put("c", 0.4); 
     m.put("d", 0.5); 
     List<Double> qvec = new ArrayList<>(); 
     List<Double> dvec = new ArrayList<>(); 

     for(String key_from_qm3 : qm3.keySet()){ //for each key from qm3 
      if(m.keySet().contains(key_from_qm3)){ //check if it exists in the keyset of m 
       qvec.add(qm3.get(key_from_qm3)); //if yes put the value from qm3 into qvec. //map.get(key) returns the value for that key 
       dvec.add(m.get(key_from_qm3));  // and the value from m into dvec 
      } 
     } 

     System.out.println("qvec : " + qvec); 
     System.out.println("dvec : " + dvec); 
    } 
} 
+0

Vielen Dank, es hilft viel –

+0

Sie sollten 'm.containsKey (key_from_qm3)' anstelle von 'm.keySet() verwenden. Contains (key_from_qm3)' –

0

Ihre Aufgabe, soweit verständlich, kann wie folgt erreicht werden:

for(Map.Entry<String, Double> qe : qm3.entrySet()) { 
    qvec.add(qe.getValue()); 
    dvec.add(m.getOrDefault(qe.getKey(), 0.0)); 
} 

qvec alle Werte enthält von qm3, ähnlich dem Ergebnis der qvec.addAll(qm3.values()); und dvec wird die enthalten Werte, die dem gleichen Schlüssel oder 0.0 zugeordnet sind, wenn keine Zuordnung vorhanden war, muss jedoch betont werden, dass HashMap s keine definierte Reihenfolge haben. Wenn nur beide Listen innerhalb der Schleife gefüllt werden, ist sichergestellt, dass die resultierenden Positionen mit demselben Schlüssel verknüpft sind. Es ist jedoch völlig undefiniert, welcher Schlüssel welcher Position zugeordnet ist.

Weiter, qm3 enthält weniger Schlüssel als m in Ihrem Beispiel, so dass die Fallback 0.0 wird nie zutreffen.


Vielleicht möchten Sie alle Schlüssel beider Karten berücksichtigen:

LinkedHashSet<String> keys = new LinkedHashSet<>(); 
keys.addAll(qm3.keySet()); 
keys.addAll(m.keySet()); 
for(String key: keys) { 
    qvec.add(qm3.getOrDefault(key, 0.0)); 
    dvec.add(m.getOrDefault(key, 0.0)); 
} 

Dieses eine LinkedHashSet enthält alle Schlüssel erstellt, die die Reihenfolge beibehalten werden, in dem sie eingeführt wurden, so dass Sie auch verwenden können Das setzt später fest, um herauszufinden, welche Listenposition welchem ​​Schlüssel zugeordnet ist. Dann füllt es die Listen mit dem Standard 0.0 für beide.

Verwandte Themen