【问题标题】:How to convert a Map to Arraylist of Objects?如何将地图转换为对象数组列表?
【发布时间】:2017-07-30 09:58:44
【问题描述】:

假设我有这样的 Json 响应:

{
  "status": true,
  "data": {
    "29": "Hardik sheth",
    "30": "Kavit Gosvami"
  }
}

我正在使用 Retrofit 来解析 Json 响应。根据this 的回答,我将不得不使用Map<String, String>,它将提供地图中的所有数据。现在我想要的是ArrayList<PojoObject>

PojoObject.class

public class PojoObject {
    private String mapKey, mapValue;

    public String getMapKey() {
        return mapKey;
    }

    public void setMapKey(String mapKey) {
        this.mapKey = mapKey;
    }

    public String getMapValue() {
        return mapValue;
    }

    public void setMapValue(String mapValue) {
        this.mapValue = mapValue;
    }
}

Map<key,value> 转换为List<PojoObject> 的最佳方法是什么?

【问题讨论】:

  • 你也有动态键吗?
  • @VivekMishra 是的
  • 为什么首先需要一个列表?地图是更好的数据容器。无论如何,如果您真的需要它只是通过地图进行简单循环并为列表创建PojoObject 对象,那么这里到底有什么问题?

标签: java android arraylist


【解决方案1】:

您可以使用此方法将地图转换为列表

List<PojoObject> list = new ArrayList<PojoObject>(map.values());

假设:

Map <Key,Value> map;

【讨论】:

  • 如果它是Map&lt;Key, PojoObject&gt;,则此方法有效。但是,如果它是Map&lt;String, String&gt;,如OP所述,它将创建一个ArrayList&lt;String&gt;
  • 这将不起作用,因为它无法解析构造函数 'ArrayList(java.util.Collection;
【解决方案2】:

试试这个

List<Value> list = new ArrayList<Value>(map.values());

或者

hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

需要注意的是,两个数组的排列顺序可能不一样。

hashMap.entrySet().toArray();

【讨论】:

  • 如果它是Map&lt;Key, PojoObject&gt;,则此方法有效。但是,如果它是Map&lt;String, String&gt;,如OP所述,它将创建一个ArrayList&lt;String&gt;
  • 这是错误的。 map.values() 将返回仅包含以下值的 List:"Hardik sheth","Kavit Gosvami"
  • 编辑没有解决问题,你还没有PojoObjects。
【解决方案3】:

如果您可以扩展您的类以使构造函数也获取值:

map.entrySet()
   .stream()
   .map(e -> new PojoObject(e.getKey(), e.getValue()))
   .collect(Collectors.toList());

如果你不能:

map.entrySet()
   .stream()
   .map(e -> {
       PojoObject po = new PojoObject();
       po.setMapKey(e.getKey());
       po.setMapValue(e.getValue());
       return po;
 }).collect(Collectors.toList());

请注意,这使用 Java 8 Stream API。

【讨论】:

  • 我们可以像通用函数一样使用这个流吗
  • @jebinhector 你到底指的是什么?结果是一个 List,如果你的意思是临时 Stream 那么不,你不能重用 Streams。
【解决方案4】:
ArrayList<Map<String,String>> list = new ArrayList<Map<String,String>>();

这可能是最好的方法。

【讨论】:

    【解决方案5】:

    看起来 Java 有你想要的精确 POJO Map.Entry。因此,您可以从映射中提取条目集并像下面那样迭代条目集,或者您可以进一步将集合转换为列表,如下一个 sn-p 并继续处理。

     //fetch entry set from map
    Set<Entry<String, String>> set = map.entrySet();        
    
        for(Entry<String, String> entry: set) {
            System.out.println(entry.getKey() +"," + entry.getValue());
        }
    
        //convert set to list
        List<Entry<String, String>> list = new ArrayList(set);
    
        for(Entry<String, String> entry: list) {
            System.out.println(entry.getKey() +"," + entry.getValue());
        }
    

    【讨论】:

    • 注意不能用Map.Entry改变key的值,这使得OP的动态key是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多