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相关文章推荐
- android开发实用代码片段集合(更新ing)
- Android开发实用的技术博客集合
- Android开发实用技巧:Drawable和Bitmap之间的转换
- Android开发中实现数组和集合list的相互转换
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- 史上最全的android开发资料大集合
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- cygwin跨平台移植开发系列2--so2lib实用工具(把cygwin生成的so或dll转换成vc可调用的lib)
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选
- MYSQL开发实用知识集合
- 实用Android开发工具和资源精选
- 实用Android开发工具和资源精选