【问题标题】:How to initialize List of List of HashMaps in one line?如何在一行中初始化 HashMap 列表列表?
【发布时间】:2014-10-30 18:25:20
【问题描述】:

我需要创建一个包含 [[{IMEI=49015420323751}], [{PIN=538000001}]] 之类的值的对象,以便将其转换为 JSON。

现在我正在做的是

        ArrayList<ArrayList<HashMap<String,String>>> Request_Identifiers = new ArrayList<ArrayList<HashMap<String,String>>>();
        ArrayList<HashMap<String,String>> list1 = new ArrayList<HashMap<String,String>>();
        HashMap<String,String> map1 = new HashMap<String,String>();
        map1.put("IMEI","49015420323751");
        list1.add(map1);
        ArrayList<HashMap<String,String>> list2 = new ArrayList<HashMap<String,String>>();
        HashMap<String,String> map2 = new HashMap<String,String>();
        map2.put("PIN","538000001");
        list2.add(map2);

        Request_Identifiers.add(list1);    
        Request_Identifiers.add(list2);

但我现在需要在构造函数中执行此操作(例如如何初始化字符串数组 new String[]{"blocked","suspended","classmask"})或为此编写一个 setter 方法。怎么做 ?我真的很困惑。如果有人可以在这里帮助我,我会很高兴。

提前致谢。

编辑:

我需要在 java 中创建一个 JSON 对象来传递 java 中的请求,就像

        {
            "attributes": ["blocked", "suspended"],
            "authPolicy":  ["device_valid"],
            "identity":  "first_id",
            "encoding": "default",
            "identifiers":
            [
                [
                    {"PIN": "234576"},
                    {"IMEI": "49015420323751"}
                ],
                [
                    {"PIN": "68000001"}
                ]
            ]
        }

所以我在写一个java类,打算用gson转成json格式

        class RequestBody
        {
            String[] Request_Attributes;
            String[] Request_Policies;
            String Request_Identity;
            String Request_Encoding;        
            Boolean Auth_Client;
            Boolean Handle_429;
            ArrayList<ArrayList<HashMap<String,String>>> Request_Identifiers;
            public RequestBody()
            {
                Request_Attributes = new String[]{"blocked","suspended","classmask"};
                Request_Policies =  new String[]{"bbm_meetings"};
                Request_Identity = "first_id";
                Request_Encoding = "default";       
                Auth_Client = true;
                Handle_429 = true;
            }
        }



        //System.out.println(RequestBody.Request_Identity);
        Gson gson = new Gson();
        System.out.println(gson.toJson(new RequestBody()));

我不知道这是否可行,但这是目前解决问题的方法。

对不起,如果这看起来太初级了,我是编程初学者。

【问题讨论】:

  • 您始终可以将发布的代码打包为返回地图列表列表的方法。看起来它可能是一个static 方法,所以从构造函数中调用它不会有问题。你真正想解决什么问题?顺便说一句:你应该将Request_Identifiers的类型声明为List&lt;List&lt;Map&lt;String, String&gt;&gt;&gt;;在类型中使用具体类会阻止您使用 Arrays.asList() 之类的东西,它会返回不是 ArrayListList
  • 您可能需要考虑创建一个Request_Identifiers Class 来保存这些信息。
  • This: ArrayList>> 是一个糟糕的语法,会咬你... 请告诉我们你想解决什么样的问题解决,因此我们可以建议一种比您目前尝试使用的更清洁的方法。
  • @R4J 我更新了这个问题。请帮忙。谢谢
  • 我实际上会为此类对象创建一个构建器并添加您需要的任何属性。附带说明:您使用的命名约定(Request_Attributes 等)不是 Java 的。

标签: java json collections gson


【解决方案1】:

如果目标只是将所有内容集中到几行,您可以使用double brace / instance initialization

// Could be one line, but formatted for (some) readability
ArrayList<ArrayList<HashMap<String,String>>> Request_Identifiers = new ArrayList<ArrayList<HashMap<String,String>>>{
    {
      add(new ArrayList<HashMap<String,String>{{ add( new HashMap<String,String>{{ put("IMEI","49015420323751"); }}; ); }});
      add(new ArrayList<HashMap<String,String>{{ add( new HashMap<String,String>{{ put("PIN","538000001"); }}; ); }});
    }
};

这显然不是非常可读或可维护的。如果您想提供一种更简单的方法来访问您的数据,遵循良好的 OO 设计模式并创建一个映射到您的模型的 POJO 数据对象,这将是一种更好的方法。

// handle your arrays/maps internally as part of the constructor
RequestIdentifiers requestIdentifiers = new RequestIdentifiers( "49015420323751", "538000001" ); 

【讨论】:

  • 虽然它节省了一些击键,但代码看起来很糟糕..但是技术很好。为此 +1
  • 哈,请求是一行,不是漂亮的代码:P
  • Doublesharp - 您希望您的同事编写这样的代码吗?当你看到这样的事情时,我认为教育人们总是好的:)
  • 我实际上只是在我的答案中添加了建议使用 POJO 作为模型。
【解决方案2】:

您不能对您尝试创建的列表执行此操作。您必须使用方法add 将值插入到列表中。列表不能像匿名数组一样创建。

虽然,您可以使用Arrays.asList(T...),但在您的情况下不太可取,尽管您可以创建这样的列表

Arrays.asList(Arrays.asList(T...),Arrays.asList(T...),Arrays.asList(T...))

在一天结束的时候,你必须创建一个地图,你不能这样做,像这样。

【讨论】:

  • 总有Arrays.asList() 可以即时创建列表。
  • @TedHopp 但是因为他想创建一个地图列表列表,所以我给出了这个答案。但你是对的。我应该给出更准确的答案。感谢您的评论.. :)
  • 可以使用双括号初始化:new Map&lt;String, String&gt; myMap = new HashMap&lt;String, String&gt;{{ put( "key", "value" ); }};
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多