All Downloads are FREE. Search and download functionalities are using the official Maven repository.

zhao.algorithmMagic.utils.ASStr Maven / Gradle / Ivy

There is a newer version: 1.42
Show newest version
package zhao.algorithmMagic.utils;

import zhao.algorithmMagic.exception.OperatorOperationException;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

/**
 * Java类于 2022/10/11 19:04:22 创建
 * 

* 字符串工具类 * * @author 4 */ public final class ASStr { /** * 检查字符串是否符合数值类型 * * @param data 需要被检查的字符串 * @return 检查之后的结果数值。 */ public static boolean checkIsNum(String data) { for (int i = 0; i < data.length(); i++) { char c = data.charAt(i); if ((c < 48 && c != '.') || c > 57) return false; } return true; } /** * 统计某个字符出现的次数 * * @param StringToBeCounted 被统计的字符串 * @param s 被计数的字符 * @return 统计某个字符出现的次数 */ public static int count(String StringToBeCounted, String s) { int res = 0; int length2 = s.length(); int length1 = StringToBeCounted.length() + length2 - 1; for (int i = 0; i < length1; i += length2) { if (StringToBeCounted.substring(i, i + length2).equals(s)) ++res; } return res; } /** * 判断一个字符中是否包含某个字符,或某些字符 * * @param str1 被判断的字符串 * @param c 判断包含的所有字符串 * @return 是否包含该字符 */ public static boolean contains(String str1, char... c) { if (c.length < 1) { return false; } else if (c.length == 1) { final char c2 = c[0]; for (char c1 : str1.toCharArray()) { if (c1 == c2) { return true; } } } else { Arrays.sort(c); for (char c1 : str1.toCharArray()) { if (search(c, c1) != -1) return true; } } return false; } /** * 二分查找,查找到目标值所在的索引值 * * @param chars 需要被查找的有序字符串 * @param target 目标字符 * @return 目标字符在nums中的索引数值,如果不存在则返回 -1 */ public static int search(char[] chars, char target) { if (chars[0] != target) { // 获取到索引 int start = 0, end = chars.length; int backStart = -1, backEnd = -1; // 准备一个循环标记 while (start < end && (start != backStart || end != backEnd)) { backStart = start; backEnd = end; int mod = start + ((end - start) >> 1); // 判断当前数值是否大于根节点的数值 char c = chars[mod]; if (target > c) { // 如果大于,代表target 存在于根节点的右边,因此将[start, mod - 1]的索引区间舍弃 start = mod; } else if (target < c) { // 如果小于,代表在根节点左边,因此将[mod , end] 舍弃 end = mod + 1; } else { // 如果等于,直接将当前节点索引返回 return mod; } } return -1; } else { return 0; } } /** * 将一个字符串按照某个连续的字符进行拆分。 * * @param data 需要被拆分的字符串数据 * @param chars 连续拆分字符组 其中的所有字符都会作为切分符 要求是有序的哦!! * @return 字符串按照字符拆分之后的字符串数组 */ public static String[] splitBySortChars(String data, char[] chars) { ArrayList arrayList = checkAndSB(data); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < data.length(); ++i) { char c1 = data.charAt(i); if (search(chars, c1) != -1) { int length = stringBuilder.length(); if (length != 0) { arrayList.add(stringBuilder.toString()); stringBuilder.delete(0, length); } } else { stringBuilder.append(c1); } } if (stringBuilder.length() != 0) { arrayList.add(stringBuilder.toString()); } return arrayList.toArray(new String[0]); } /** * 将一个字符串按照某个连续的字符进行拆分。 * * @param data 需要被拆分的字符串数据 * @param chars 连续拆分字符组 其中的所有字符都会作为切分符 要求是有序的哦!! * @param stopWord 通用词列表,在本次 * @return 字符串按照字符拆分之后的字符串数组 */ public static String[] splitBySortChars(String data, char[] chars, HashSet stopWord) { if (stopWord == null || stopWord.size() == 0) { return splitBySortChars(data, chars); } else { ArrayList arrayList = checkAndSB(data); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < data.length(); ++i) { char c1 = data.charAt(i); if (search(chars, c1) != -1) { int length = stringBuilder.length(); if (length != 0) { String s = stringBuilder.toString(); if (!stopWord.contains(s)) { arrayList.add(s); stringBuilder.delete(0, length); } } } else { stringBuilder.append(c1); } } if (stringBuilder.length() != 0) { String s = stringBuilder.toString(); if (!stopWord.contains(s)) { arrayList.add(s); } } return arrayList.toArray(new String[0]); } } /** * 将一个字符串数据按照指定的字符进行拆分,拆分出很多数据。 * * @param data 需要被拆分的字符串数据 * @param c 分隔符 * @return 拆分之后的字符串数据 */ public static String[] splitByChar(String data, char c) { ArrayList arrayList = new ArrayList<>(); StringBuilder stringBuilder = new StringBuilder(); int length = data.length(); for (int i = 0; i < length; i++) { char at = data.charAt(i); if (at == c) { if (stringBuilder.length() != 0) { arrayList.add(stringBuilder.toString()); stringBuilder.delete(0, stringBuilder.length()); } } else { stringBuilder.append(at); } } if (stringBuilder.length() != 0) { arrayList.add(stringBuilder.toString()); stringBuilder.delete(0, stringBuilder.length()); } return arrayList.toArray(new String[0]); } /** * 检查并构造出一个大小适合的字符串建造者对象 * * @param data 目标字符串 * @return 字符串建造者 */ private static ArrayList checkAndSB(String data) { int i1 = data.length() >> 1; ArrayList arrayList; if (i1 <= 10) { arrayList = new ArrayList<>(); } else { arrayList = new ArrayList<>(i1); } return arrayList; } /** * 替换一个字符串中首个出现的字符 old 变为新字符 * * @param s 需要被替换的字符串 * @param old 需要被替换的字符 * @param newChar 替换之后的字符串 * @return 替换之后的新字符串 */ public static String replaceCharFirst(String s, char old, char newChar) { char[] charArray = s.toCharArray(); for (int i = 0; i < charArray.length; i++) { if (charArray[i] == old) { charArray[i] = newChar; return new String(charArray); } } return s; } /** * 将一个数组转换成为makeDown中的一行字符串形式的数据 * * @param ints 需要被转换的字符串 * @return 转换之后的字符串数据 */ public static String arrayToMarkdownStr(int[] ints) { StringBuilder stringBuilder = new StringBuilder(ints.length << 1); for (int anInt : ints) { stringBuilder.append(anInt).append('\t'); } return stringBuilder.toString(); } /** * 将一个数组转换成为makeDown中的一行字符串形式的数据 * * @param ints 需要被转换的字符串 * @return 转换之后的字符串数据 */ public static String arrayToMarkdownStr(double[] ints) { StringBuilder stringBuilder = new StringBuilder(ints.length << 1); for (double anInt : ints) { stringBuilder.append(anInt).append('\t'); } return stringBuilder.toString(); } /** * 将数据流中的数据转换成为整形数值矩阵对象。 * * @param bufferedReader 包含数据的字符输入流 * @param length 需要解析的行数量 * @param sep 解析时需要使用的分隔符。 * @return 经过解析之后返回的结果二维数组对象。 */ public static int[][] strToIntMat(BufferedReader bufferedReader, int length, char sep) { try { int[][] lines = new int[length][]; int index = -1; while (bufferedReader.ready()) { String[] strings = ASStr.splitByChar(bufferedReader.readLine(), sep); int[] row = new int[strings.length]; int index1 = -1; for (String s : strings) { row[++index1] = Integer.parseInt(s); } lines[++index] = row; } return lines; } catch (IOException e) { throw new OperatorOperationException(e); } } /** * 将数据流中的数据转换成为整形数值矩阵对象。 * * @param bufferedReader 包含数据的字符输入流 * @param length 需要解析的行数量 * @param sep 解析时需要使用的分隔符。 * @return 经过解析之后返回的结果二维数组对象。 */ public static double[][] strToDoubleMat(BufferedReader bufferedReader, int length, char sep) { try { double[][] lines = new double[length][]; int index = -1; while (bufferedReader.ready()) { String[] strings = ASStr.splitByChar(bufferedReader.readLine(), sep); double[] row = new double[strings.length]; int index1 = -1; for (String s : strings) { row[++index1] = Integer.parseInt(s); } lines[++index] = row; } return lines; } catch (IOException e) { throw new OperatorOperationException(e); } } /** * 将数据流中的数据转换成为整形数值矩阵对象。 * * @param bufferedReader 包含数据的字符输入流 * @param sep 解析时需要使用的分隔符。 * @return 经过解析之后返回的结果二维数组对象。 */ public static int[][] strToIntMat(BufferedReader bufferedReader, char sep) { try { ArrayList lines = new ArrayList<>(); while (bufferedReader.ready()) { String[] strings = ASStr.splitByChar(bufferedReader.readLine(), sep); int[] row = new int[strings.length]; int index1 = -1; for (String s : strings) { row[++index1] = Integer.parseInt(s); } lines.add(row); } return lines.toArray(new int[0][]); } catch (IOException e) { throw new OperatorOperationException(e); } } /** * 将数据流中的数据转换成为整形数值矩阵对象。 * * @param bufferedReader 包含数据的字符输入流 * @param sep 解析时需要使用的分隔符。 * @return 经过解析之后返回的结果二维数组对象。 */ public static double[][] strToDoubleMat(BufferedReader bufferedReader, char sep) { ArrayList lines = new ArrayList<>(); try { while (bufferedReader.ready()) { String[] strings = ASStr.splitByChar(bufferedReader.readLine(), sep); double[] row = new double[strings.length]; int index1 = -1; for (String s : strings) { row[++index1] = Integer.parseInt(s); } lines.add(row); } return lines.toArray(new double[0][]); } catch (IOException e) { throw new OperatorOperationException(e); } } /* /** * 将一个数组直接反转 * * @param doubles 需要被反转的数组 * @return 反转之后的数组的结果 * / public static double[] ArrayReverse(double... doubles) { int back = doubles.length - 1; int length = doubles.length >> 1; for (int i = 0; i < length; ++i) { double aDouble2 = doubles[back]; doubles[back--] = doubles[i]; doubles[i] = aDouble2; } return doubles; } */ }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy