Java HashMap中嵌套String或ArrayList

3

我刚接触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类型,并自己实现不相交的联合逻辑。 - Andy Turner
在Python中,我可以创建嵌套字典,这正是我想做的。有一个与多个不同属性相关联的单个ID。我将它们放入HashMap中,以便可以遍历它们并访问元素以放入完整字符串中。每个UserID号码(238991)有多个OrderIDs,但只有1个名称。然后,每个OrderID将与3或4个字符串相关联。我的目标是将与1个UserID号码相关联的所有OrderIDs的所有字符串连接起来。 - nahata5
1
Java不是Python。它有类型。 - tgkprog
String和ArrayList都是Object的子类型-您可以仅使用值类型为Object的哈希映射表。这不是建议,但是您可以这样做-抛弃类型并仅使用类似Python中的“dict”的任何容器。 - khelwood
一个包含所需字段的 Map<Integer, Order> 对象,为什么不能使用?深度嵌套的数据结构很难处理 - 这就是为什么面向对象编程存在的原因。 - dimo414
4个回答

2

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


我已经创建了一个对象类,当我想要它们在嵌套字典中而不是在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]
    

有没有比HashMap更好的方法来获取各种对象类型的嵌套键/值对呢? - nahata5
据我所知,目前没有这样的功能。但是,如果你发现自己经常这样做,那可能意味着你没有用Java的思维方式来思考问题。"Java的方式"是创建类,而不是通过嵌套开放式集合类型来表示数据结构。(Java不是Python...) - Stephen C

0

你应该使用POJO(普通旧Java对象)进行工作。 创建一个覆盖你需求的类更加可行。

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>,尽管它是完全有效的语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接