2016-07-14 36 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>但它是一个完全有效的语法。