随机获取一个会合(List, Set)中的元素,随机获取一个Map中的key或value
随机获取一个集合(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.HashSet; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; /** * 随机数工具,单例模式 * @author XuJijun * */ public class RandomUtils { private static Random random; //双重校验锁获取一个Random单例 public static Random getRandom() { 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 Math.abs(getRandom().nextInt())%max; } /** * 获得一个[0,max)之间的整数。 * @param max * @return */ public static long getRandomLong(long max) { return Math.abs(getRandom().nextInt())%max; } /** * 从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; } 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)); } } }
版权声明:本文为原创文章,转载请注明转自Clement-Xu的****博客。