距離上一次寫博已過了很久。。也是有點偷懶了java
今天帶來不久前對優惠券編碼的隨機生成代碼分享。git
需求:給指定會員發放指定幾種類型的優惠券,每類發一種app
參數:會員ID、優惠券類型ID集合dom
生成規則:ui
系統時間隨機生成數字- >5位編碼
+會員ID(左填充0) - >5位spa
+類型ID - >1位code
+隨機5位之母插入以上生成的11位的不一樣位置orm
package com.**.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; public class CouponCodeAutoGenerate { public static CouponCodeAutoGenerate generate =null; private final static String NUM_CHAR = "0123456789"; private static int charLen = NUM_CHAR.length(); private CouponCodeAutoGenerate(){ } public static CouponCodeAutoGenerate getInstance(){ if(generate ==null){ generate =new CouponCodeAutoGenerate(); } return generate; } public Map<Long,String> autoGenerateCouponCode(Long memberId,List<Long> idList){ Map<Long,String> map =new HashMap<Long, String>(); StringBuilder sb =null; StringBuilder sbr =null; int[] intRet = null; int insertIndex =0; for(Long id :idList){ sb=new StringBuilder(); //系統時間 5位 sb.append(getRandomByCurrentTime(5)); //memberId 5位左填充0 sb.append(String.format("%05d",memberId)); //類型 1位 sb.append(id); // 5個隨機字母 sbr=new StringBuilder(getRandChar(5)); intRet =getRetIndex(5,sb.length()+1); for(int i=0;i<sbr.length();i++){ insertIndex =intRet[i]+i; sb.insert(insertIndex, sbr.charAt(i)); } map.put(id, sb.toString()); } return map; } public String getRandChar(int s){ String val =""; for(int i=0 ;i <s ;i++){ Random random = new Random(); int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; //取得大寫字母仍是小寫字母 val += (char) (choice + random.nextInt(26)); } return val ; } public String getRandomByCurrentTime(int randomNumberDigit) { long seed = System.currentTimeMillis();// 得到系統時間,做爲生成隨機數的種子 StringBuffer sb = new StringBuffer();// 裝載生成的隨機數 Random random = new Random(seed);// 調用種子生成隨機數 for (int i = 0; i < randomNumberDigit; i++) { sb.append(NUM_CHAR.charAt(Math.abs(random.nextInt())% charLen)); } return sb.toString(); } //替換位置 //從0-t中取s個不一樣數字 public int[] getRetIndex(int s,int t) { // TODO Auto-generated method stub int[] intRet = new int[s]; int intRd = 0; //存放隨機數 int count = 0; //記錄生成的隨機數個數 int flag = 0; //是否已經生成過標誌 while(count<s){ Random rdm = new Random(); intRd = Math.abs(rdm.nextInt())% t; for(int i=0;i<count;i++){ if(intRet[i]==intRd){ flag = 1; break; }else{ flag = 0; } } if(flag==0){ intRet[count] = intRd; count++; } } return intRet; } public static void main(String[] args) { List<Long> typeList =new ArrayList<Long>(); typeList.add(1L); typeList.add(2L); typeList.add(3L); Map<Long,String> code =CouponCodeAutoGenerate.getInstance().autoGenerateCouponCode(23l, typeList); Set<Map.Entry<Long,String>> it =code.entrySet(); for (Map.Entry<Long,String> entry : it) { System.out.println(entry.getKey()+"---"+entry.getValue()); } } }