• 你会用shuffle打乱列表吗?


    转载自:http://www.cnblogs.com/lanxuezaipiao/p/3192980.html

    作者:Alexia

    在网站上我们经常会看到关键字云(Word Cloud)和标签云(Tag Cloud),用于表明这个关键字或标签是经常被查阅的,而且还可以看到这些标签的动态运动,每次刷新都会有不一样的关键字或便签,让浏览者觉得这个网站的访问量非常大,短短的几分钟就有这么多的搜索量。这是怎么实现的呢?其实非常简单:先从数据库中读出标签,然后使用随机数打乱,每次都产生不同的顺序,嗯,确实能让浏览者感觉到我们的标签云顺序在变——浏览者多嘛!但是,对于乱序处理我们有哪些方法呢?

    下面给出一个大家都会想到的方法:

    复制代码
        public <T> void shuffle1(List<T> list) {
            int size = list.size();
            Random random = new Random();
            
            for(int i = 0; i < size; i++) {
                // 获取随机位置
                int randomPos = random.nextInt(size);
                
                // 当前元素与随机元素交换
                T temp = list.get(i);
                list.set(i, list.get(randomPos));
                list.set(randomPos, temp);
            }
        }
    复制代码

    很简单,实现方法也很多,但有更简单的实现方法:

    复制代码
        public <T> void shuffle2(List<T> list) {
            int size = list.size();
            Random random = new Random();
            
            for(int i = 0; i < size; i++) {
                // 获取随机位置
                int randomPos = random.nextInt(size);
                
                // 当前元素与随机元素交换
                Collections.swap(list, i, randomPos);
            }
        }
    复制代码

    上面使用了Collections的swap方法,该方法会交换两个位置的元素值,不用我们自己写交换代码了,是不是更简单呢?

    其实,我想说,还有更更简单的方法,如下:

        public <T> void shuffle3(List<T> list) {
            // 打乱顺序
            Collections.shuffle(list);
        }

    这才是我们想要的结果,就这一句话即可打乱一个列表的顺序,不用我们费尽心思的遍历、替换元素了!

    现在来测试一下,是不是都能成功实现打乱顺序呢?下面给出完整源代码:

    复制代码
    package arrlist;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;
    
    /**
     * 打乱列表中数据元素的三种实现方法
     * 
     * @author Alexia
     * @date 2013-7-16
     *
     */
    public class ShuffleTest {
    
        // 打乱列表实现方法1
        public <T> void shuffle1(List<T> list) {
            int size = list.size();
            Random random = new Random();
            
            for(int i = 0; i < size; i++) {
                // 获取随机位置
                int randomPos = random.nextInt(size);
                
                // 当前元素与随机元素交换
                T temp = list.get(i);
                list.set(i, list.get(randomPos));
                list.set(randomPos, temp);
            }
        }
        
        // 打乱列表实现方法2
        public <T> void shuffle2(List<T> list) {
            int size = list.size();
            Random random = new Random();
            
            for(int i = 0; i < size; i++) {
                // 获取随机位置
                int randomPos = random.nextInt(size);
                
                // 当前元素与随机元素交换
                Collections.swap(list, i, randomPos);
            }
        }
        
        // 打乱列表实现方法3
        public <T> void shuffle3(List<T> list) {
            // 打乱顺序
            Collections.shuffle(list);
        }
        
        // 打印列表
        public <T> void print(List<T> list) {
            for(T t : list) {
                System.out.print(t + " ");
            }
            
            System.out.println("
    ");
        }
        
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            ShuffleTest st = new ShuffleTest();
            List<String> tagClouds = new ArrayList<String>(6);
            
            // 一般从数据库中读取,这里仅以测试为目的
            tagClouds.add("计算机");
            tagClouds.add("Java");
            tagClouds.add("编程");
            tagClouds.add("C/C++");
            tagClouds.add("操作系统");
            tagClouds.add("数据库");
            System.out.println("原顺序:");
            st.print(tagClouds);
            
            st.shuffle1(tagClouds);
            System.out.println("打乱顺序一:");
            st.print(tagClouds);
            
            st.shuffle2(tagClouds);
            System.out.println("打乱顺序二:");
            st.print(tagClouds);
            
            st.shuffle3(tagClouds);
            System.out.println("打乱顺序三:");
            st.print(tagClouds);
        }
    
    }
    复制代码

    输出结果如下:

    我们一般很少用到shuffle这个方法,那它可以用在什么地方呢?

    (1)可以用在程序的“伪装”上

        比如我们例子中的标签云,或者是游戏中的打怪、修行、群殴时宝物的分配策略。

    (2)可以用在抽奖程序中

        比如年会的抽奖程序,先使用shuffle把员工顺序打乱,每个员工的中奖几率就是相等的了,然后就可以抽取第一名、第二名。

    (3)可以用在安全传输方面

        比如发送端发送一组数据,先随机打乱顺序,然后加密发送,接收端解密,然后自行排序,即可实现即使是相同的数据源,也会产生不同密文的效果,加强了数据的安全性。


  • 相关阅读:
    第12组 Alpha事后诸葛亮
    第12组 Alpha冲刺(6/6)
    第12组 Alpha冲刺(5/6)
    2019 SDN上机第4次作业
    2019 SDN阅读作业
    第12组 Alpha冲刺(4/6)
    第12组 Alpha冲刺(3/6)
    第12组 Alpha冲刺(2/6)
    2019 SDN上机第3次作业
    第10组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637311.html
Copyright © 2020-2023  润新知