2016-07-14 41 views
3

新的Java和很好奇,如果有一種方法,使一個HashMap的值是一個字符串或一個ArrayList:Java的HashMap的嵌套字符串或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)); 

我寧願只添加一個字符串如果我可以爲名稱而不是訪問列表的第一個元素。這可能嗎?

+1

請您詳細說明您要做什麼? o.O – Silverclaw

+1

是/還是?不,除非你創建一個'StringOrArrayList'類型,並且自己實現不相交的聯合邏輯。 –

+0

在python中,我可以創建嵌套字典,這是我想要做的。有一個與許多不同屬性相關聯的ID。我將它們放到HashMap中,以便我可以遍歷它們並訪問要放入完整字符串的元素。每個UserID號碼有多個OrderID(238991),但只有一個名稱。每個OrderID將有3或4個與之相關的字符串。我的目標是連接所有與1個用戶ID號碼相關的所有OrderID的字符串。 – nahata5

回答

2

您應該創建一個POJO,並把它作爲HashMap值。它可以包含您需要的所有數據。在Java中編寫「pythonic」代碼也是一樣糟糕,反之亦然。

+0

我有一個對象類已經創建,我試圖重新發明輪子,當我希望他們在一個嵌套的字典,沒有必要在Java ..涼爽,謝謝 – nahata5

0

答案可能是否定的。

我說 「可能」,是因爲這樣的:

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

會打印:

[Smith, John] 

這工作,因爲ArrayList.toString()方法格式化列表。然而,這可能不是你想要什麼,因爲:

  • 周圍還有名方括號,並
  • 如果已經在列表中一個以上的元素,你會得到所有的人;例如

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

有沒有更好的方式來最終獲得不同對象類型的嵌套鍵/值對比HashMap? – nahata5

+0

不是我所知道的。但是,如果你發現自己做了這麼多事情,這可能意味着你沒有用Java思考。 「Java方法」是創建類,而不是通過嵌套打開的集合類型來表示數據結構。 (Java不是Python ...) –

0

您應該使用POJO。 創建一個讓您的需求更加可行的課程。

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); 
    } 

} 

輸出:

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

公共類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()); 
     } 
    } 
} 

}

基於java泛型是否存在等我們應當定義一個特定類型例如<String, ArrayList>而不是<String, Object>但它是一個完全有效的語法。

相關問題