| package org.yzh.commons.util; | 
|   | 
| import java.io.PrintWriter; | 
| import java.io.StringWriter; | 
| import java.util.*; | 
|   | 
| /** | 
|  * @author yezhihao | 
|  * https://gitee.com/yezhihao/jt808-server | 
|  */ | 
| public class StrUtils { | 
|   | 
|     public static final int[] EMPTY = new int[0]; | 
|   | 
|     public static final Integer[] EMPTY_ = new Integer[0]; | 
|   | 
|     public static int[] toInts(String str, String delimiter) { | 
|         String[] split = str.split(delimiter); | 
|         int[] result = new int[split.length]; | 
|         for (int i = 0; i < split.length; i++) | 
|             result[i] = Integer.parseInt(split[i]); | 
|         return result; | 
|     } | 
|   | 
|     public static double[] toDoubles(String str, String delimiter) { | 
|         String[] split = str.split(delimiter); | 
|         double[] result = new double[split.length]; | 
|         for (int i = 0; i < split.length; i++) | 
|             result[i] = Double.parseDouble(split[i]); | 
|         return result; | 
|     } | 
|   | 
|     public static byte[] toBytes(String str, String delimiter) { | 
|         String[] split = str.split(delimiter); | 
|         byte[] result = new byte[split.length]; | 
|         for (int i = 0; i < split.length; i++) | 
|             result[i] = (byte) Integer.parseInt(split[i]); | 
|         return result; | 
|     } | 
|   | 
|     public static String merge(String delimiter, Collection value) { | 
|         if (value == null || value.size() == 0) | 
|             return null; | 
|   | 
|         StringBuilder result = new StringBuilder(value.size() * 5); | 
|         for (Object id : value) | 
|             result.append(id).append(delimiter); | 
|   | 
|         return result.substring(0, result.length() - 1); | 
|     } | 
|   | 
|     public static String merge(String delimiter, Object... value) { | 
|         if (value == null || value.length == 0) | 
|             return null; | 
|   | 
|         StringBuilder result = new StringBuilder(value.length * 5); | 
|         for (Object id : value) | 
|             result.append(id).append(delimiter); | 
|   | 
|         return result.substring(0, result.length() - 1); | 
|     } | 
|   | 
|     public static String merge(String delimiter, int... value) { | 
|         if (value == null || value.length == 0) | 
|             return null; | 
|   | 
|         StringBuilder result = new StringBuilder(value.length * 5); | 
|         for (int id : value) | 
|             result.append(id).append(delimiter); | 
|   | 
|         return result.substring(0, result.length() - 1); | 
|     } | 
|   | 
|     public static int[] toInts(Integer[] src) { | 
|         if (src == null || src.length == 0) | 
|             return EMPTY; | 
|   | 
|         int[] dest = new int[src.length]; | 
|         for (int i = 0; i < src.length; i++) | 
|             dest[i] = src[i]; | 
|         return dest; | 
|     } | 
|   | 
|     public static Integer[] toInts(int[] src) { | 
|         if (src == null || src.length == 0) | 
|             return EMPTY_; | 
|   | 
|         Integer[] dest = new Integer[src.length]; | 
|         for (int i = 0; i < src.length; i++) | 
|             dest[i] = src[i]; | 
|         return dest; | 
|     } | 
|   | 
|     public static Integer parseInt(String num) { | 
|         return parseInt(num, null); | 
|     } | 
|   | 
|     public static Integer parseInt(String num, Integer defVal) { | 
|         if (isBlank(num)) | 
|             return defVal; | 
|         try { | 
|             return Integer.parseInt(num); | 
|         } catch (NumberFormatException e) { | 
|             return defVal; | 
|         } | 
|     } | 
|   | 
|     public static String toUnderline(String str) { | 
|         StringBuilder result = new StringBuilder(str.length() + 4); | 
|         char[] chars = str.toCharArray(); | 
|   | 
|         result.append(Character.toLowerCase(chars[0])); | 
|   | 
|         for (int i = 1; i < chars.length; i++) { | 
|             char c = chars[i]; | 
|             if (Character.isUpperCase(c)) | 
|                 result.append('_').append(Character.toLowerCase(c)); | 
|             else | 
|                 result.append(c); | 
|         } | 
|         return result.toString(); | 
|     } | 
|   | 
|     public static String subPrefix(String str, String prefix) { | 
|         if (str != null && str.startsWith(prefix)) | 
|             str = str.substring(prefix.length()); | 
|         return str; | 
|     } | 
|   | 
|     public static Map newMap(Object... entrys) { | 
|         Map result = new HashMap((int) (entrys.length / 1.5) + 1); | 
|         for (int i = 0; i < entrys.length; ) | 
|             result.put(entrys[i++], entrys[i++]); | 
|         return result; | 
|     } | 
|   | 
|     public static boolean isNotBlank(String str) { | 
|         return !isBlank(str); | 
|     } | 
|   | 
|     public static boolean isBlank(String str) { | 
|         return str == null || str.length() == 0 || str.trim().length() == 0; | 
|     } | 
|   | 
|     public static <T> T getDefault(T value, T defaultValue) { | 
|         return value != null ? value : defaultValue; | 
|     } | 
|   | 
|     public static String leftPad(String str, int size, char ch) { | 
|         int length = str.length(); | 
|         int pads = size - length; | 
|         if (pads > 0) { | 
|             char[] result = new char[size]; | 
|             str.getChars(0, length, result, pads); | 
|             while (pads > 0) | 
|                 result[--pads] = ch; | 
|             return new String(result); | 
|         } | 
|         return str; | 
|     } | 
|   | 
|     public static int[] toArray(Collection<Integer> list) { | 
|         if (list == null || list.isEmpty()) | 
|             return null; | 
|   | 
|         int[] result = new int[list.size()]; | 
|         int i = 0; | 
|         for (Integer e : list) { | 
|             if (e != null) | 
|                 result[i++] = e; | 
|         } | 
|         return result; | 
|     } | 
|   | 
|     public static Set<Integer> toSet(int... num) { | 
|         if (num == null || num.length == 0) { | 
|             return Collections.EMPTY_SET; | 
|         } | 
|         Set<Integer> result; | 
|         if (num.length <= 3) { | 
|             result = new TreeSet<>(); | 
|         } else { | 
|             result = new HashSet<>(num.length << 1); | 
|         } | 
|         for (int i : num) { | 
|             result.add(i); | 
|         } | 
|         return result; | 
|     } | 
|   | 
|     public static boolean isNum(String val) { | 
|         if (isBlank(val)) { | 
|             return false; | 
|         } | 
|         int sz = val.length(); | 
|         for (int i = 0; i < sz; i++) { | 
|             if (!Character.isDigit(val.charAt(i))) { | 
|                 return false; | 
|             } | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     public static String getStackTrace(final Throwable throwable) { | 
|         final StringWriter sw = new StringWriter(7680); | 
|         final PrintWriter pw = new PrintWriter(sw, true); | 
|         throwable.printStackTrace(pw); | 
|         return sw.getBuffer().toString(); | 
|     } | 
|   | 
|     private static final char[] hexCode = "0123456789abcdef".toCharArray(); | 
|   | 
|     public static String bytes2Hex(byte[] bytes) { | 
|         char[] hex = new char[bytes.length << 1]; | 
|         for (int j = 0, i = 0; i < bytes.length; i++) { | 
|             byte b = bytes[i]; | 
|             hex[j++] = hexCode[(b >> 4) & 0xF]; | 
|             hex[j++] = hexCode[(b & 0xF)]; | 
|         } | 
|         return new String(hex); | 
|     } | 
|   | 
|     public static byte[] hex2Bytes(String hex) { | 
|         final int len = hex.length(); | 
|   | 
|         if (len % 2 != 0) { | 
|             throw new IllegalArgumentException("hexBinary needs to be even-length: " + hex); | 
|         } | 
|   | 
|         byte[] out = new byte[len >> 1]; | 
|         for (int i = 0; i < len; i += 2) { | 
|   | 
|             int h = hexToBin(hex.charAt(i)); | 
|             int l = hexToBin(hex.charAt(i + 1)); | 
|             if (h == -1 || l == -1) { | 
|                 throw new IllegalArgumentException("contains illegal character for hexBinary: " + hex); | 
|             } | 
|             out[i >> 1] = (byte) (h * 16 + l); | 
|         } | 
|         return out; | 
|     } | 
|   | 
|     public static int hexToBin(char ch) { | 
|         if ('0' <= ch && ch <= '9') { | 
|             return ch - '0'; | 
|         } | 
|         if ('A' <= ch && ch <= 'F') { | 
|             return ch - ('A' - 10); | 
|         } | 
|         if ('a' <= ch && ch <= 'f') { | 
|             return ch - ('a' - 10); | 
|         } | 
|         return -1; | 
|     } | 
| } |