【问题标题】:Java HashMap with nested String or ArrayList带有嵌套 String 或 ArrayList 的 Java HashMap
【发布时间】:2016-07-14 13:51:11
【问题描述】:

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

如果可以的话,我宁愿只为名称添加一个字符串,而不是只访问列表的第一个元素。这可能吗?

【问题讨论】:

  • 您能否详细说明您要做什么? o.O
  • 要么/要么?不,除非你创建一个StringOrArrayList 类型,并自己实现不相交的联合逻辑。
  • 在python中,我可以创建嵌套字典,这就是我想要做的。有一个 id 与许多不同的属性相关联。我将它们放入 HashMap 中,以便可以遍历它们并访问要放入完整字符串的元素。每个用户 ID 号 (238991) 有多个 OrderID,但只有 1 个名称。然后,每个 OrderID 将有 3 或 4 个与之关联的字符串。我的目标是连接与 1 个用户 ID 号的所有 OrderID 关联的所有字符串。
  • Java 不是 python。有类型。
  • String 和 ArrayList 都是 Object 的子类型——你可以只拥有一个值类型为 Object 的 hashmap。这不是建议。但你可以这样做 - 扔掉打字,只需要一个像 Python 的 dict 这样的任何容器。

标签: java arraylist hashmap


【解决方案1】:

您应该创建一个 POJO,并将其用作 HashMap 值。它可以包含您需要的所有数据。用 Java 编写“pythonic”代码和反过来写一样糟糕。

【讨论】:

  • 我已经创建了一个对象类,当我希望它们位于嵌套字典中时,我试图重新发明轮子,这在 Java 中不是必需的......很酷,谢谢
【解决方案2】:

答案可能是否定的。

我说“可能”是因为:

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]
    

【讨论】:

  • 有没有比 HashMap 更好的方法来最终获得各种对象类型的嵌套键/值对?
  • 我不知道。但是,如果你发现自己经常做这种事情,那可能意味着你没有用 Java 思考。 “Java 方式”是创建类而不是通过嵌套开放集合类型来表示数据结构。 (Java 不是 Python ...)
【解决方案3】:

您应该使用 POJO。 创建一个满足您需求的类更为可行。

主类

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

订单类

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]}

【讨论】:

    【解决方案4】:
    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 泛型的存在,我们应该定义一个特定的类型,例如&lt;String, ArrayList&gt; 而不是 &lt;String, Object&gt;,但它是完全有效的语法。

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2016-06-14
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      相关资源
      最近更新 更多