Serial number auto-increment rules:
Arabic numerals are automatically incremented, English letters are automatically incremented (ignoring upper and lower case), Roman numerals are automatically incremented, and letters + numbers are mixed;
it supports dynamic digits and automatically handles the problem of full digits.
package com.jeeplus.codingrules.utils;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
/**
* 算法工具类
* @author lgn
* @date 2023/4/23 10:32
*/
public class AlgorithmUtils {
/**
* 获取英文字母流水号
* @author lgn
* @date 2023/4/23 10:51
* @param c
* @return String
*/
public static String getEnglishLetter(String c) {
c=c.trim();
char [] tempChar = c.toCharArray();
for(int i =tempChar.length-1;i>=1;i--){
if (tempChar[i]<'z' ){
tempChar[i]=(char)(tempChar[i]+1);
break;
}else {
tempChar[i]='a';
tempChar[i-1]=(char)(tempChar[i-1]+1);
if (tempChar[i-1]<='z'){
i=0;
}
}
}
return String.valueOf(tempChar);
}
/**
* 字母有效检查
* 1.检查字母是否都为Z
* 2.检查字母长度
* @param driver
* @param len
* @return
*/
public static String driverCheck(String driver,int len){
char[] charArray = driver.toCharArray();
List list=new ArrayList();
for (char c : charArray) {
if(c=='Z' || c=='z'){
list.add(1);
}
}
if(list.size()==driver.length() && list.size()==len){//如所有字母都为Z,并且长度达到限定长度,长度自增一位
StringBuffer sb=new StringBuffer();
for (int i=0;i<len+1;i++) {
sb.append("A");
}
return sb.toString();
}
return getEnglishLetter(driver);
}
/**
* 获取递增罗马字符流水号
* @author lgn
* @date 2023/4/23 10:37
* @param c
* @return String
*/
public static String getRomanCharacters(String c) {
c=c.trim();
int i=romanToInt(c)+1;
return intToRoman(i);
}
/**
* 数字流水+1 自增
* @author lgn
* @date 2023/4/23 11:12
* @param oldNum 旧字段
* @param digit 位数
* @return String
*/
public static String getOldNum(String oldNum,String digit){
if (StringUtils.isNotEmpty(oldNum) && StringUtils.isNotEmpty(digit)){
//String oldNum ="0001";
//String maxOldNum = "9999";
//%nd 输出的整型宽度至少为n位,右对齐,%4d即宽度至少为4位,位数大于4则输出实际位数,0表示用0补齐
//String digitFormat="%04d";
String digitFormat="%0"+digit+"d";
if(null !=oldNum){
int i = Integer.parseInt(oldNum)+1;
oldNum = String.format(digitFormat, i);
}
}
return oldNum;
}
/**
* 一些id标识的要求,比如数字自增,0001,0002,0003等。下面这个方法实现了这个功能:
* 思路:int a;a++;fillstr();
* @author lgn
* @date 2023/4/23 10:54
* @param value
* @param count 总长度
* @param frontORback 头部 尾部拼接
* @param fillChar 补位显示
* @return String
*/
private static String fillStr(String value, int count, boolean frontORback, String fillChar) {
String rtvalue = value;
if (rtvalue == null) {
rtvalue = "";
for (int i = 0; i < count; i++)
if (frontORback)
rtvalue = String.valueOf(rtvalue)
+ String.valueOf(fillChar);
else
rtvalue = String.valueOf(fillChar)
+ String.valueOf(rtvalue);
} else {
int len = rtvalue.length();
if (len > count) {
rtvalue = rtvalue.substring(0, count);
} else {
int a = count - len;
for (int i = 0; i < a; i++)
if (frontORback)
rtvalue = String.valueOf(rtvalue)
+ String.valueOf(fillChar);
else
rtvalue = String.valueOf(fillChar)
+ String.valueOf(rtvalue);
}
}
return rtvalue;
}
/**
* 将数值拼接成对应的位数
* @param oldValue 前缀:aa0001
* @param elDigit 英文的位数
* @param numDigit 数字的位数
* @return 拼接好的流水号
*/
public static String getCodeOfSix(String oldValue,String elDigit,String numDigit) {
String el =oldValue.substring(0,Integer.valueOf(elDigit));
String oldNumSo=oldValue.substring(Integer.valueOf(elDigit));
String newCode="";
String newNum=getOldNum(oldNumSo,numDigit);//数字先递增
if (newNum.length()>Integer.valueOf(numDigit)){//数字位数已满,字母进位
//fillStr("aa",6,true,"0");
newCode=fillStr(getEnglishLetter(el),Integer.valueOf(elDigit)+Integer.valueOf(numDigit)-1,true,"0")+"1";
}else {
newCode=el+newNum;
}
return newCode;
}
/**
* 罗马数字转阿拉伯数字
* @author lgn
* @date 2023/4/23 10:41
* @param s
* @return int
*/
public static int romanToInt(String s) {
HashMap<String, Integer> map = new HashMap<>();
map.put("I", 1);
map.put("V", 5);
map.put("X", 10);
map.put("L", 50);
map.put("C", 100);
map.put("D", 500);
map.put("M", 1000);
map.put("IV", 4);
map.put("IX", 9);
map.put("XL", 40);
map.put("XC", 90);
map.put("CD", 400);
map.put("CM", 900);
int res = 0;
int idx = 0;
while (idx < s.length()) {
if (idx + 1 < s.length() && map.containsKey(s.substring(idx, idx + 2))) {
res += map.get(s.substring(idx, idx + 2));
idx += 2;
} else {
res += map.get(s.substring(idx, idx + 1));
idx++;
}
}
return res;
}
/**
* 阿拉伯数字转罗马数字
* @author lgn
* @date 2023/4/23 10:43
* @param num
* @return String
*/
public static String intToRoman(int num) {
HashMap<Integer, String> maps = new HashMap<>();
maps.put(1, "I");
maps.put(5, "V");
maps.put(10, "X");//
maps.put(50, "L");//
maps.put(100, "C"); //
maps.put(500, "D");//
maps.put(1000, "M");//
maps.put(4, "IV");
maps.put(9, "IX");//
maps.put(40, "XL");//
maps.put(90, "XC");//
maps.put(400, "CD");//
maps.put(900, "CM");//
String res = "";
int[] digits = new int[13];
digits[0] = 1000;
digits[1] = 900;
digits[2] = 500;
digits[3] = 400;
digits[4] = 100;
digits[5] = 90;
digits[6] = 50;
digits[7] = 40;
digits[8] = 10;
digits[9] = 9;
digits[10] = 5;
digits[11] = 4;
digits[12] = 1;
while(num>0){
for(int i=0; i<digits.length; i++){
if(num>=digits[i]){
res += maps.get(digits[i]);
num -= digits[i];
break;
}
}
}
return res;
}
//求差集,属于str但是不属于pa
public static String DifferentSet(String str,String pa){
if(str==null || str.length()==0 || pa==null || pa.length()==0) return "";
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
char strc[] = str.toCharArray();
char pac[] = pa.toCharArray();
HashSet set = new HashSet();
for(int i=0;i<strc.length;i++)
list1.add(strc[i]);
for(int j=0;j<pac.length;j++)
list2.add(pac[j]);
for(int k =0;k<list2.size();k++){
if(list1.contains(list2.get(k))){
list1.remove(list2.get(k));
}
}
String stringFromList = StringUtils.join(list1,"");
return stringFromList;
}
public static void main(String[] args) {
/* String outString="";
outString=fillStr("1", 4, false, "0");
System.out.println("false:"+outString);
outString=fillStr("1", 4, true, "0");
System.out.println("true:"+outString);*/
System.out.println("======阿拉伯数字自增======"+getOldNum("9999","4"));
System.out.println("======英文字母自增======"+getEnglishLetter("az"));
System.out.println("======英文字母自增满位进一位======"+driverCheck("zZZZz",5));
System.out.println("======int转罗马数字======"+intToRoman(1));
System.out.println("======罗马数字转int======"+romanToInt("I"));
System.out.println("=======罗马数字自增=====:"+getRomanCharacters("I"));
System.out.println("======字母+数字转(数字未满位)======"+getCodeOfSix("aa0001","2","4"));
System.out.println("======数字自增======"+fillStr("aa",4,true,"0"));
System.out.println("======字母+数字转(数字满位)======"+getCodeOfSix("aa9999","2","4"));
List<String> list = new ArrayList<>();
list.add("1");
list.add("a");
list.add("3");
list.add("c");
System.out.println(StringUtils.join(list, ","));
System.out.println(StringUtils.join(list, ""));
}
}
Get the last two digits of the year and month:
package com.jeeplus.codingrules.utils;
import org.apache.commons.lang.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class DateUtils {
/**
* 获取当前年份的后两位
* @author lgn
* @date 2023/4/21 9:29
* @return String
*/
public static String getHalfYear() {
//当前是2020年,则输出20
//当前是2019年,则输出19
String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
return year;
}
/**
* 月份和天不足两位时补上0
* @author lgn
* @date 2023/4/21 9:42
* @return String
*/
public static String getRepairMonthOrDay(String flag) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
/* String normalizeMonth = StringUtils.leftPad(String.valueOf(calendar.get(Calendar.MONTH) + 1), 2, '0');
String normalizeDay = StringUtils.leftPad(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)), 2, '0');
System.out.printf("当前月份:%s,当前几号:%s%n", normalizeMonth, normalizeDay);*/
String normalize="";
if ("month".equals(flag)){
normalize= StringUtils.leftPad(String.valueOf(calendar.get(Calendar.MONTH) + 1), 2, '0');
}else {
normalize = StringUtils.leftPad(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)), 2, '0');
}
return normalize;
}
public static void main(String[] args) {
System.out.println(getRepairMonthOrDay("month"));
}
}