2016-07-14 7 views
3

Neu bei Java und war gespannt, ob es eine Möglichkeit war, den Wert eines HashMap zu machen entweder ein String oder ein Arraylist:Java HashMap mit verschachtelten String oder Arraylist

HashMap<String, HashMap<String, ArrayList<String>>> map = new HashMap<String, HashMap<String, ArrayList<String>>>(); 
map.putIfAbsent("238991", new HashMap<String, ArrayList<String>>()); 
map.get("238991").put("OrderID", new ArrayList<>()); 
map.get("238991").get("OrderID").add("1234H"); 
map.get("238991").get("OrderID").add("1233B"); 
map.get("238991").put("Name", new ArrayList<>()); 
map.get("238991").get("Name").add("Smith, John"); 
System.out.println(map.get("238991")); 
System.out.println(map.get("238991").get("Name").get(0)); 

ich nur einen String hinzufügen bevorzugen wenn ich für den Namen kann, anstatt nur auf das erste Element der Liste zuzugreifen. Ist das möglich?

+1

Könnten Sie bitte näher erläutern, was Sie zu tun versuchen? o.O – Silverclaw

+1

Entweder/oder? Nein, es sei denn, Sie erstellen einen StringOrArrayList-Typ und implementieren die disjunkte Unionslogik selbst. –

+0

In Python kann ich verschachtelte Wörterbücher erstellen, das ist etwas, was ich versuche zu tun. Es gibt eine einzelne ID, die verschiedenen Eigenschaften zugeordnet ist. Ich setze sie in eine HashMap, damit ich sie durchlaufen kann und auf die Elemente zugreifen kann, um sie in eine vollständige Zeichenfolge einzufügen. Es gibt mehrere OrderIDs pro UserID-Nummer (238991), aber es gibt nur einen Namen. Jede Bestell-ID wird dann mit 3 oder 4 Zeichenfolgen verknüpft sein. Mein Ziel ist es, alle Strings, die mit allen OrderIDs für 1 UserID-Nummer verknüpft sind, zu verbinden. – nahata5

Antwort

2

Sie sollten ein POJO, erstellen und als der HashMap Wert verwenden. Es kann alle Daten enthalten, die Sie benötigen. Das Schreiben von "Python" -Code in Java ist genauso schlimm, als umgekehrt.

+0

Ich hatte ein Objekt Klasse bereits erstellt, ich habe versucht, das Rad neu zu erfinden, wenn ich wollte, dass sie in einem verschachtelten dict, nicht notwendig in Java .. cool, danke – nahata5

0

Die Antwort ist wahrscheinlich nein.

ich sage "wahrscheinlich", weil diese:

System.out.println(map.get("238991").get("Name").toString()); 

druckt:

[Smith, John] 

Das funktioniert, weil die ArrayList.toString() Methode wird die Liste formatiert werden. Dies ist jedoch wahrscheinlich nicht, was Sie wollen, weil:

  • gibt es eckige Klammern um den Namen und
  • das, wenn Sie mehr als ein Element in der Liste haben Sie werden alle von ihnen erhalten; z.B.

    map.get("238991").get("Name").add("Jones, Barry"); 
    
    [Smith, John, Jones, Barry] 
    
+0

Gibt es einen besseren Weg, um letztlich ein geschachteltes Schlüssel/Wert-Paar verschiedener Objekttypen als eine HashMap zu erhalten? – nahata5

+0

Nicht, dass ich mir dessen bewusst bin. Wenn Sie jedoch feststellen, dass Sie so etwas tun, bedeutet das wahrscheinlich, dass Sie nicht in Java denken. Der "Java-Weg" besteht darin, Klassen zu erstellen, anstatt Datenstrukturen durch Verschachteln offener Sammlungstypen darzustellen. (Java ist nicht Python ...) –

0

Sie sollten mit POJOs arbeiten. Erstellen Sie eine Klasse, die Ihren Anforderungen entspricht, ist viel machbarer.

main.class

import java.util.ArrayList; 
import java.util.HashMap; 

public class OwnClass { 

    public static void main(String[] args) { 
     HashMap<String, Order> map = new HashMap<>(); 
     ArrayList<String> orderItems = new ArrayList<>(); 
     orderItems.add("1234H"); 
     orderItems.add("1234B"); 
     map.putIfAbsent("238991", new Order("Smith, John", orderItems)); 


     map.get("238991").addOrder("1234J"); 

     System.out.println(map); 
    } 
} 

Order.class

import java.util.ArrayList; 

public class Order { 

    private String customer; 
    private ArrayList<String> items; 

    public Order(String string, ArrayList<String> orderItems) { 
     this.customer = string; 
     this.items = orderItems; 
    } 

    @Override 
    public String toString() { 
     return "Customer " + customer + " ordered " + items; 
    } 

    public void addOrder(String string) { 
     items.add(string); 
    } 

} 

Ausgang:

{238991=Customer Smith, John ordered [1234H, 1234B, 1234J]} 
0
import java.util.*; 

public class MapReceivesListOrString {

public static void main(String []args){ 

    boolean shouldAddList = true; 

    Map<String, Object> map = new HashMap<String, Object>(); //Creating a HashMap Polymorphically 
    List<String> list = new ArrayList<>(); 

    list.add("1234H"); 
    list.add("1233B"); 

    String code1 = "some code one"; 
    String code2 = "some code two"; 

    if (shouldAddList) { // Your business logic whether to add a list or a string 
     map.put("OrderID", list);   
    } else { 
     map.put("code1", code1); 
     map.put("code2", code2); 
    } 

    for (Map.Entry<String, Object> mapValues : map.entrySet()) { // Iterate over many list's or many string's 
     Object value = mapValues.getValue(); 

     if (value instanceof List) { 
      ArrayList myList = (ArrayList) value; 

      System.out.println("List value one: " + list.get(0)); 
      System.out.println("List value two: " + list.get(1)); 
     } else { 
      System.out.println("String value: " + value.toString()); 
     } 
    } 
} 

}

auf der Existenz von Java Generics Basierend sollten wir eine bestimmte Art definieren z.B. <String, ArrayList> statt <String, Object> nichtsdestoweniger ist es eine vollständig gültige Syntax.