我想根据键检索map(ArrayList),请帮我提供下面的代码
public class MainActivity extends AppCompatActivity {
Map<String,ArrayList<Model>> map=new ArrayMap<>(); <----
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......
.....
for (int j=0;j<jsonArray.length();j++)
{
JSONObject tempObj=jsonArray.getJSONObject(j);
String price =tempObj.getString("price");
String product=tempObj.getString("Product");
String qty=tempObj.getString("Qty");
modelList.add(new Model(id,price,product,qty,date));
map.put(key,modelList); <----
modelList.clear();
}
......
......
//here to retrieve that map in the same mainactivity
CODE....??????? <----
这是我的json,那些月份是动态的(jan,pril,jun,...它们不是恒定的)。
{
"response": "success",
"servicecode": "134",
"forecast": {
"month": {
"jan": [
{
"id": "1",
"price": "12",
"Product": "1086",
"Qty": "14"
},
{
"id": "2",
"price": "19",
"Product": "1746",
"Qty": "45"
}
],
"april": [
{
"id": "3",
"price": "89",
"Product": "1986",
"Qty": "15"
},
{
"id": "1",
"price": "12",
"Product": "1086",
"Qty": "145"
}
],
"jun": [
{
"id": "81",
"price": "132",
"Product": "17086",
"Qty": "1445"
},
{
"id": "11",
"price": "132",
"Product": "10786",
"Qty": "1445"
}
]
}
},
"message": "Competitor Sales."
}
我所做的是我用键将所有响应分别存储在MAp中,现在要做的是在View页面中根据月份显示数组。所以告诉我map'll做得好或任何其他选择。...
答案 0 :(得分:1)
使用地图绝对是正确的主意,因为您可以每月分配一个对象。
但是,您可能要考虑使用LinkedHashMap
而不是ArrayMap
,因为LinkedHashMap
会保留插入顺序,而ArrayMap's docs没有提到在任何地方都保留插入顺序。
保留插入之所以重要很重要,是因为JSON中的months
对象是按照您想要显示的顺序显示的。因此,如果首先解析“ January”,则可以保证在地图的前面。
您可以按以下方式声明和初始化LinkedHashMap:
Map<String, ArrayList<Model>> map = new LinkedHashMap<>();
我假设您已正确地将此json解析为对象,因为您未对未正确填充地图以及通过放置箭头“ <-----”
现在,让代码实际使用Map。
for (String monthName : map.keySet()) {
ArrayList<Model> modelArray = map.get(monthName);
//now do whatever your view pager needs to do with this Model and its fields
for (Model model : modelArray) {
String price = model.getPrice(); //if you have a getter
String product = model.product; //if the field is public
}
}
注意:
使用LinkedHashMap's keyset是有效的,因为文档保证键集按插入顺序排列。另外,this SO answer也证实了这一事实。
我个人建议使用GSON来解析JSON对象,但是由于您似乎可以接受解析,所以这没什么大不了的。
答案 1 :(得分:0)
如果正确放置ArrayMap,则可以按以下方式获取它:
Model model = map.get("april");
String id = model.id;
String price = model.price;
.....
您应确保代码中的key
变量是月份名称。
答案 2 :(得分:0)
月份是您地图的关键吗? 如果是这样,那么您可以简单地定义一个月份列表并相应地检索值,如下所示:
for(String month: Arrays.asList("jan", "feb", "mar", "apr", "...")) {
if(map.containsKey(month)) { //skip months if not present
//--> code here
Model model = map.get(month);
}
}