随机获取一个集合(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)); } }
梅花香自古寒来