您的位置:首页 > 移动开发 > Android开发

Android开发中实用的集合形式转换

2017-05-25 09:10 281 查看

前言:

不知道大家在android开发中有没有遇到过这样情况,App客户端先开发,后台系统后开发,这会有什么不愿意遇见的情况发生呢?

App之所以可以先开发,因为我们可以先写一些复杂的UI,比如一些开发该App中的自定义控件;此时可以不用后台接口提供的数据,因为我们可以自己模拟;那好问题来了,后台系统开发完成后,发现自己模拟的数据格式,和后台接口提供的数据格式不一样(因为前后台沟通不良从而导致的),然后用后台接口提供的数据太不方便,和重写这个复杂自定义UI没差别,工作量太大,不宜采用这种方法,只能将后台提供的接口数据格式转化为自己实际需要的数据格式

ps: 这么坑爹的情况,还真被我遇见了!


开始说说我自己遇到的情况:

♥♥♥ 模拟的json数据(集合)格式,也就是实际我需要的json数据(集合)格式是如下图显示的这样 —【集合①】

[
{
"x":1,
"y":["xx:xx","xx:xx","xx:xx"],
"z":[1,1,1]
},
{
"x":2,
"y":["xx:xx","xx:xx","xx:xx","xx:xx"],
"z":[2,2,2,2]
},
{
"x":3,
"y":["xx:xx","xx:xx"],
"z":[3,3]
}
]


由于接口拉下来的数据太复杂,我抽象成了比较好观看的json形式,但怕看的太抽象了,举例简单说明一下:

- x: 代表 “某日期”(int类型)

- y: 代表 “某记录的时间”(String类型)

- z: 代表 “某记录的状态”(int类型)

ps:所以我需要的是某用户某一天内的所有记录时间和记录状态。

♥♥♥ 但是实际上的json数据(集合)格式是如下图显示的这样 —【集合②】

[
{
"x":2,
"y":"xx:xx",
"z":2
},
{
"x":1,
"y":"xx:xx",
"z":1
},
{
"x":1,
"y":"xx:xx",
"z":1
},
{
"x":2,
"y":"xx:xx",
"z":2
},
{
"x":1,
"y":"xx:xx",
"z":1
},
{
"x":2,
"y":"xx:xx",
"z":2
},
{
"x":3,
"y":"xx:xx",
"z":3
},
{
"x":3,
"y":"xx:xx",
"z":3
},
{
"x":2,
"y":"xx:xx",
"z":2
}
]


是以一条条的数据形式提供的,只有某一天的某个记录的时间和记录的状态,同一天的还有多条记录,根本没法用

ps:所以我需要从后台提供的json数据集合中每个对象中的【y】和【z】的值取出来与去重的 “ x ” 重新组合成一个新的字典,也就是上面显示的那样。

如何转换(【集合②】—>【集合①】)

1. 用Gsonformat自动生成两个bean类,一个是接口给定的已知的数据Bean类,一个是实际使用到的有jia价值的数据Bean类

/**
* 接口给定的已知的数据Bean类
*/
public class KnownBean {
/**
* x : 1
* y : "xxx"
* z : 1
*/
private int x;
private String y;
private int z;
... ...  ... //省略Getter和Setter方法
}


/**
* 实际使用到的有jia价值的数据Bean类
*/
public class UsefulBean {

/**
* x : 1
* y : ["xxx","xxx","xxx"]
* z : [1,1,1]
*/

private int x;
private List<String> y;
private List<Integer> z;

//加一个有参的构造函数,方便之后赋值
public UsefulBean(int x, List<String> y, List<Integer> z) {
this.x = x;
this.y = y;
this.z = z;
}
... ...  ... //省略Getter和Setter方法
}


2.主要定义两个集合变量

//后台接口提供的已知数据集合
List<KnownBean> knownBeans;
//实际当中使用到的数据集合
List<UsefulBean> usefulBeans;
//模拟数据,就是后台提供的已知的json数据
String temp= "[{\"x\":2,\"y\":\"xx:xx\",\"z\":2},{\"x\":1,\"y\":\"xx:xx\",\"z\":1},{\"x\":1,\"y\":\"xx:xx\",\"z\":1},{\"x\":2,\"y\":\"xx:xx\",\"z\":2},{\"x\":1,\"y\":\"xx:xx\",\"z\":1},{\"x\":2,\"y\":\"xx:xx\",\"z\":2},{\"x\":3,\"y\":\"xx:xx\",\"z\":3},{\"x\":3,\"y\":\"xx:xx\",\"z\":3},{\"x\":2,\"y\":\"xx:xx\",\"z\":2}]";
//Gson工具类
Gson gson;


3.进行一些初始化的操作

gson = new Gson();
knownBeans = new ArrayList<>();
usefulBeans = new ArrayList<>();
//把模拟数据通过Gson转化为集合
knownBeans = gson.fromJson(temp, new TypeToken<List<KnownBean>>() {}.getType());


4.编写集合转化的具体方法

/**
* 集合转换 【 knownBeans ---> usefulBeans 】
*/
public List<UsefulBean> changeList(List<KnownBean> knownBeans){
/**
* 1.创建一个集合 “ x_List ”,把已知的集合里每个JsonObject对象中的【x】取出来,放进新创建的集合中
*/
List<Integer> x_List = new ArrayList<>();
for (int i = 0; i < knownBeans.size(); i++) {
x_List.add(knownBeans.get(i).getX());
}

/**
* 2. 把集合 “ x_List ” 去重,并从小到达排序
*/
//2.1.全部放到set集合中x
Set x_List_sort = new HashSet();
x_List_sort.addAll(x_List);
//2.2.set去重后的集合全部放回集合中
x_List.clear();
x_List.addAll(x_List_sort);
//2.3默认排序
Collections.sort(x_List);

/**
* 3.从已知的数据集合中每个对象中的【y】和【z】取出来与 “ x_List ”中的 “ x ” 重新组合成一个新的字典
*/
for (int i = 0; i < x_List.size(); i++) {
usefulBeans.add(getUsefulBean(knownBeans,x_List.get(i)));
}

return usefulBeans;
}

/**
* 从已知的数据集合中每个对象中的【y】和【z】取出来与 “ x_List ”中的 “ x ” 重新组合成一个新的字典
*/
public UsefulBean getUsefulBean(List<KnownBean> knownBeans,int x_List) {
//创建一个集合y,和一个集合z
List<String> y = new ArrayList<>();
List<Integer> z = new ArrayList<>();
//循环遍历已给数据集合,把和新集合x值匹配的y、z加入到新创建的集合y、z中
for (int i = 0; i < knownBeans.size(); i++) {
if (knownBeans.get(i).getX() == x_List) {
y.add(knownBeans.get(i).getY());
z.add(knownBeans.get(i).getZ());
}
}
//最后返回一个完整能在实际当中使用的bean
return new UsefulBean(x_List, y, z);
}


5.最后调用集合转换方法即可

//开始转换
usefulBeans = changeList(knownBeans);
//打印Log
KLog.json(gson.toJson(usefulBeans));


总结:

  这是实习开发过程中碰到的第一个问题,并且思考之后努力的解决了,虽然很简单,但也是个小小的进步,心里还是挺开心的。

初次创作,如有不足之处,恳请大家提出意见和建议,或者有更简单的转换方法,希望能分享给我噢,十分感谢您的阅读O(∩_∩)O
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: