隨機獲取一個集合(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));
	}
}






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM