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

来源:互联网 发布:编辑部的故事 知乎 编辑:程序博客网 时间:2024/05/20 01:09

前言:

不知道大家在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