当前位置: 首页 > news >正文

兑换码(Java)

类似游戏兑换码格式,或者自定义格式的兑换码生成。

支持自定义格式,支持添加对象参数。

package com.krls.simulator;

import org.springframework.util.CollectionUtils;

import java.lang.reflect.Field;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class T333 {

    /**
     * 对象转Map
     *
     * @param object
     * @return
     * @throws IllegalAccessException
     */
    public static Map<String, Object> beanToMap(Object object) throws IllegalAccessException {
        if (object instanceof Map) {
            return (Map<String, Object>) object;
        }
        Map<String, Object> map = new HashMap<>(16);
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            map.put(field.getName(), field.get(object));
        }
        return map;
    }

    public static String replaceAttr(String str, Object obj) {
        if (obj == null) {
            return str;
        }
        try {
            Map<String, Object> map = beanToMap(obj);
            if (!CollectionUtils.isEmpty(map)) {
                for (Map.Entry<String, Object> entity : map.entrySet()) {
                    String val = entity.getValue() == null ? "" : entity.getValue().toString();
                    str = str.replaceAll("\\$\\{" + entity.getKey() + "}", val);
                }
            }
        } catch (IllegalAccessException e) {

        }
        return str;
    }

    public static String replaceRandom(String source, Map<String, String> map) {
        String reg = "\\[([^.]-[^.])+]\\{[0-9]*}";
        Matcher matcher = Pattern.compile(reg).matcher(source);
        int i = 0;
//        System.out.println(source);
        while (matcher.find()) {
            String group = matcher.group();
            String radius = group.substring(group.indexOf("\\[") + 2, group.indexOf("]"));
            String num = group.substring(group.indexOf("{") + 1, group.indexOf("}"));
            String key = "$" + i + "_" + Integer.parseInt(num);
            map.put(key, getRandomStr(radius));
            source = source.substring(0, source.indexOf(group)) + "$" + i++ + source.substring(source.indexOf(group) + group.length());
        }
        return source;
    }

    public static String getRandomStr(String str) {
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < str.length(); i = i + 3) {
            int len = (int) str.charAt(i + 2) - (int) str.charAt(i);
            for (int j = 0; j <= len; j++) {
                buffer.append((char) ((int) str.charAt(i) + j));
            }
        }
        return buffer.toString();
    }

    public static List<String> getRandomStr(String str, int len, int size) {
        Random random = new Random();
        List<String> list = new ArrayList<>();
        StringBuilder cache = new StringBuilder();
        for (int i = 0; i < len * size; i++) {
            int temp = random.nextInt(str.length());
            cache.append(str.charAt(temp));
            if ((i + 1) % len == 0) {
                list.add(cache.toString());
                cache = new StringBuilder();
            }
        }
        return list;
    }

    /**
     * 兑换码生成(V1.0)
     *
     * @param pattern => [0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}  ${randomNo}-[0-9A-Z]{5}
     * @param obj     => object(id=? name? randomNo?)
     * @param size    =>
     * @return
     */
    public static List<String> getRandomCode(String pattern, Object obj, int size) {
        pattern = replaceAttr(pattern, obj);
        Map<String, String> map = new HashMap<>(16);
        pattern = replaceRandom(pattern, map);
//        size = size > 2 << 4 ? size * 3 / 2 : size << 1;
        Map<Integer, String> result = new HashMap<>(16);
        for (int i = 0; i < size; i++) {
            result.put(i, pattern);
        }
        if (!CollectionUtils.isEmpty(map)) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                String key = entry.getKey();
                String val = entry.getValue();
                String[] arr = key.split("_");
                List<String> randoms = getRandomStr(val, Integer.parseInt(arr[1]), size);
                for (int i = 0; i < randoms.size(); i++) {
                    result.put(i, result.get(i).replace(arr[0], randoms.get(i)));
                }
            }
        }
        return new ArrayList<>(result.values());
    }
}

http://www.dtcms.com/a/114300.html

相关文章:

  • 小白速通:Verilog流水线实现及时序分析
  • Mybatis注解开发进阶之复杂的关联查询
  • Nacos注册中心AP模式核心源码分析(集群模式)
  • (一)从零开始:用 LangChain 和 ZhipuAI 搭建简单对话
  • SonarQube数据库配置
  • Flutter之页面布局一
  • Kubernetes 集群搭建(一):k8s 从环境准备到 Calico 网络插件部署(1.16版本)
  • 常见的图像生成算法
  • 堆与二叉树的关系
  • Python四大核心数据结构深度解析:列表、元组、字典与集合
  • STM32F103C8T6实现 SG90 360 °电机转动
  • 积分赛——获取环境温度
  • PyTorch深度学习框架60天进阶学习计划 - 第36天:医疗影像诊断(一)
  • Unhandled exception: org.apache.poi.openxml4j.exceptions.InvalidFormatException
  • 混合精度策略在PBiCGStab算法中的应用
  • 数据蒸馏:Dataset Distillation by Matching Training Trajectories 论文翻译和理解
  • Redis数据结构之String
  • 蓝桥杯:对字符串处理常用知识笔记
  • 如何在Ubuntu上安装Dify
  • 控件主题效果添加程序设计
  • 【速写】SFT案例实操(以Qwen2.5-instruct-0.5B)
  • 24统计建模国奖论文写作框架(机器学习+图像识别类)
  • 搭建redis主从同步实现读写分离(原理剖析)
  • Day1:前端项目uni-app壁纸实战
  • Python-函数参数
  • (四)数据检索与增强生成——让对话系统更智能、更高效
  • 微软的 Copilot 现在可以浏览网页并为您执行操作
  • Qt中左侧项目菜单中构建设置功能中的构建步骤是怎么回事
  • 数字内容个性化推荐引擎构建
  • 计算机网络实验(包括实验指导书)