牛骨文教育服务平台(让学习变的简单)
博文笔记

Android下获取集合指定长度的随机集合

创建时间:2017-03-09 投稿人: 浏览次数:935

最近要做评价标签,从标签集合中随机获取显示几个!

思路很简单: 获取一个指定长度的随机数组,之后就是arraylist.get(index)即可;

下面是小女子的做法,如果有更好的请提意见。

/**
     * 获取 source arrayList中的指定数量的随机集合
     * @param arrayList 源集合
     * @param number 指定的长度
     * @param <T> 泛型
     * @return 得到的随机集合
     */
    public static <T> ArrayList<T> randomElement(ArrayList<T> arrayList,int number){
        int size = arrayList.size() ;
        if(number > size){
            throw new RuntimeException("number can"t be greater than arrayList"s size");
        }
        if(number == size){
            return arrayList ;
        }

        ArrayList<T> _arrayList = new ArrayList<>(number) ;
        SparseArray<T> sparseArray = new SparseArray<>(number);
        Random random = new Random();
        while (sparseArray.size() < number){
            int i = random.nextInt(size) ;
            sparseArray.put(i,arrayList.get(i));
        }

        for (int i = 0;i < sparseArray.size();i++){
            int key = sparseArray.keyAt(i) ;
            _arrayList.add(sparseArray.get(key)) ;
        }

        return _arrayList ;
    }


也可以使用ArrayMap,关于ArrayMap,可以看看我借(偷)来的说明大笑


我们经常会使用到HashMap这个容器,它非常好用,但是却很占用内存。下图演示了HashMap的简要工作原理:

android_perf_3_arraymap_key_value

为了解决HashMap更占内存的弊端,Android提供了内存效率更高的ArrayMap。它内部使用两个数组进行工作,其中一个数组记录key hash过后的顺序列表,另外一个数组按key的顺序记录Key-Value值,如下图所示:

android_perf_3_arraymap_two_array

当你想获取某个value的时候,ArrayMap会计算输入key转换过后的hash值,然后对hash数组使用二分查找法寻找到对应的index,然后我们可以通过这个index在另外一个数组中直接访问到需要的键值对。如果在第二个数组键值对中的key和前面输入的查询key不一致,那么就认为是发生了碰撞冲突。为了解决这个问题,我们会以该key为中心点,分别上下展开,逐个去对比查找,直到找到匹配的值。如下图所示:

android_perf_3_arraymap_binary_search

随着数组中的对象越来越多,查找访问单个对象的花费也会跟着增长,这是在内存占用与访问时间之间做权衡交换。

既然ArrayMap中的内存占用是连续不间断的,那么它是如何处理插入与删除操作的呢?请看下图所示,演示了Array的特性:

android_perf_3_arraymap_del

android_perf_3_arraymap_add

很明显,ArrayMap的插入与删除的效率是不够高的,但是如果数组的列表只是在一百这个数量级上,则完全不用担心这些插入与删除的效率问题。HashMap与ArrayMap之间的内存占用效率对比图如下:

android_perf_3_arraymap_memory_compare

与HashMap相比,ArrayMap在循环遍历的时候也更加简单高效,如下图所示:

android_perf_3_arraymap_list

前面演示了很多ArrayMap的优点,但并不是所有情况下都适合使用ArrayMap,我们应该在满足下面2个条件的时候才考虑使用ArrayMap:

  • * 对象个数的数量级最好是千以内
  • * 数据组织形式包含Map结构

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。