• 随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value


    利用Java提供的Random类。从List或Set中随机取出一个元素,从Map中随机获取一个key或value。

    因为Set没有提供get(int index)方法,仅仅能先获取一个随机数后。利用一个计数器,对Set进行循环,当计数器等于随机数时返回当前元素,对于Map的处理也类似。

    不知有没有更好的方法……

    package com.xjj.util;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.ThreadLocalRandom;
    
    /**
     * 随机数工具,单例模式
     * @author XuJijun
     *
     */
    public class RandomUtils {
    	//private static Random random;
    
    	//双重校验锁获取一个Random单例
    	public static ThreadLocalRandom getRandom() {
    		return ThreadLocalRandom.current();
    		/*if(random==null){
    			synchronized (RandomUtils.class) {
    				if(random==null){
    					random =new Random();
    				}
    			}
    		}
    		
    		return random;*/
    	}
    
    	/**
    	 * 获得一个[0,max)之间的随机整数。
    	 * @param max
    	 * @return
    	 */
    	public static int getRandomInt(int max) {
    		return getRandom().nextInt(max);
    	}
    	
    	/**
    	 * 获得一个[min, max]之间的随机整数
    	 * @param min
    	 * @param max
    	 * @return
    	 */
    	public static int getRandomInt(int min, int max) {
    		return getRandom().nextInt(max-min+1) + min;
    	}
    
    	/**
    	 * 获得一个[0,max)之间的长整数。
    	 * @param max
    	 * @return
    	 */
    	public static long getRandomLong(long max) {
    		return getRandom().nextLong(max);
    	}
    	
    	/**
    	 * 从数组中随机获取一个元素
    	 * @param array
    	 * @return
    	 */
    	public static <E> E getRandomElement(E[] array){
    		return array[getRandomInt(array.length)];		
    	}
    	
    	/**
    	 * 从list中随机取得一个元素
    	 * @param list
    	 * @return
    	 */
    	public static <E> E getRandomElement(List<E> list){
    		return list.get(getRandomInt(list.size()));
    	}
    	
    	/**
    	 * 从set中随机取得一个元素
    	 * @param set
    	 * @return
    	 */
    	public static <E> E getRandomElement(Set<E> set){
    		int rn = getRandomInt(set.size());
    		int i = 0;
    		for (E e : set) {
    			if(i==rn){
    				return e;
    			}
    			i++;
    		}
    		return null;
    	}
    	
    	/**
    	 * 从map中随机取得一个key
    	 * @param map
    	 * @return
    	 */
    	public static <K, V> K getRandomKeyFromMap(Map<K, V> map) {
    		int rn = getRandomInt(map.size());
    		int i = 0;
    		for (K key : map.keySet()) {
    			if(i==rn){
    				return key;
    			}
    			i++;
    		}
    		return null;
    	}
    	
    	/**
    	 * 从map中随机取得一个value
    	 * @param map
    	 * @return
    	 */
    	public static <K, V> V getRandomValueFromMap(Map<K, V> map) {
    		int rn = getRandomInt(map.size());
    		int i = 0;
    		for (V value : map.values()) {
    			if(i==rn){
    				return value;
    			}
    			i++;
    		}
    		return null;
    	}
    	
    	/**
    	 * 生成一个n位的随机数,用于验证码等
    	 * @param n
    	 * @return
    	 */
    	public static String getRandNumber(int n) {
    		String rn = "";
    		if (n > 0 && n < 10) {
    			//Random r = new Random();
    			StringBuffer str = new StringBuffer();
    			for (int i = 0; i < n; i++) {
    				str.append('9');
    			}
    			int num = Integer.parseInt(str.toString());
    			while (rn.length() < n) {
    				rn = String.valueOf(ThreadLocalRandom.current().nextInt(num));
    			}
    		} else {
    			rn = "0";
    		}
    		return rn;
    	}
    	
    	public static void main(String[] args) {
    		/*Set<String> set = new HashSet<>();
    		for (int i = 0; i < 12; i++) {
    			set.add("I am: " + i);	
    		}
    		
    		for (int i = 0; i < 10; i++) {
    			System.out.println(getRandomElement(set));
    		}*/
    		
    		System.out.println(getRandom().nextInt(-100, 10));
    	}
    }
    





  • 相关阅读:
    js学习笔记之(call、apply)
    windows8 应用的激活与挂起
    SharePoint2010分享
    Windows8 Metro 设计与开发vs11风格样式
    windows8 应用激活
    Windows8 Metro 设计与开发平台预览
    windows8 账户图片设置
    Windows8 Metro 设计与开发必须关注的新特性
    Windows8 Metro 设计与开发你不知道的C模型
    Windows8 Metro 设计与开发VS11的win8模拟器
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12081325.html
Copyright © 2020-2023  润新知