仿QQ输入法诗人模式格式化字符串

2024-01-03 12:18

本文主要是介绍仿QQ输入法诗人模式格式化字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

仿QQ输入法-诗人模式-格式化字符串

直接上代码吧,没啥好说的,

关键:如何计算出分成列,每列的高度是多少

package ;import android.content.Context;import com.alibaba.fastjson.JSON;import java.util.ArrayList;
import java.util.List;/*** createTime: 2020/3/19.11:26* updateTime: 2020/3/19.11:26* author: singleMan.* desc: 诗人模式格式化字符串*/
public class BardFormatUtil {private static final int MAX_ROW_LENGTH = 7;//普通模式下一列最大的高度public static String format(Context context, String input){if(input.contains(" ")){return input;}input = input.replace("\n", "").trim();String oneSymbolStr = context.getString(R.string.a4);StringBuilder sb =new StringBuilder();List<List<String>> lists = new ArrayList<>();//如果输入的是带有标准标点符号的,优先按照标点符号分组if(hasSymbol(input) && !hasConsecutiveSymbol(input)){List<String> bdSplit = splitBySymbol(input);for(String s : bdSplit){List<String> item = new ArrayList<>();for(char c : s.toCharArray()){item.add(String.valueOf(c));}lists.add(item);}}else {char[] chars = input.toCharArray();int length = chars.length;List<String> mList = new ArrayList<>();for(char c : chars){mList.add(String.valueOf(c));}//int x = smartCompute(length);while (Math.ceil(length / x) > MAX_ROW_LENGTH){x += smartCompute(Math.ceil(length / x));}System.out.println("Input:"+input+"分:"+x);List<List<String>> list = mSubList(mList, x);lists.addAll(list);}int maxLength = lists.get(0).size();for (int i = 0; i < lists.size(); i++){if (maxLength < lists.get(i).size()){maxLength = lists.get(i).size();}}for(int a=0;a < maxLength; a++){for(int i = lists.size()-1; i>=0; i--){List<String> zu = lists.get(i);if(a < zu.size()){String s = zu.get(a);switch (hasSymbolCount(s.charAt(0))){case 1:sb.append(oneSymbolStr);sb.append(oneSymbolStr);sb.append(s);sb.append(oneSymbolStr);break;case 2:sb.append(oneSymbolStr);sb.append(s);sb.append(oneSymbolStr);break;case 4:sb.append(s);break;}if(i > 0) {sb.append(" ");}}else {sb.append(" "+" ");}}if(a < maxLength -1) {sb.append("\n");}}System.out.println("结果:\n"+sb.toString());System.out.println("---------------------------");return sb.toString();}//private static int smartCompute(double totalLength){if(totalLength <= 5d){return 1;}if(totalLength % 5d == 0d){return (int) Math.ceil(totalLength / 5d);}if(totalLength % 7d == 0d){return (int) Math.ceil(totalLength / 7d);}return 2;}/*** 根据分n组截取字符串到list* @param source* @param n     分成几组* @return*/private static List<List<String>> mSubList(List<String> source, int n) {List<List<String>> result = new ArrayList<List<String>>();int oneSize = (int) Math.ceil(Double.valueOf(source.size()) / Double.valueOf(n));System.out.println("一个:"+oneSize);for(int i = 0;i < n; i++){int start = i * oneSize;int end = (i+1) * oneSize;if(end <= source.size()){result.add(source.subList(start,end));}else {result.add(source.subList(start,source.size()));}}return result;}/*** 判断标点符号所占的宽度  单位:1/4 空格* @param c* @return*/private static int hasSymbolCount(char c){if (Character.getType(c) == Character.OTHER_LETTER || isChinesePunctuation(c)) {return 4;} else if (Character.isDigit(c)) {return 2;} else if (Character.isLetter(c)) {return 2;} else {return 1;}}/*** 是否有两个相邻的标点符号* @param str* @return*/private static boolean hasConsecutiveSymbol(String str){List<Integer> indexList = takeOutSymbol(str);for(int i = 0;i < indexList.size()-1;++i){System.out.println("标点::"+(indexList.get(i+1) - indexList.get(i)));if(indexList.get(i+1) - indexList.get(i) == 1){System.out.println("连续标点");return true;}}return false;}/*** 获取到所有的标点的字符* @param str* @return*/private static List<Integer> takeOutSymbol(String str){List<Integer> list = new ArrayList<>();int index = 0;for(char c : str.toCharArray()){if(!(Character.getType(c) == Character.OTHER_LETTER)&& !(Character.isDigit(c))&& !(Character.isLetter(c))){list.add(index+1);}index++;}if(!list.contains(str.length())){list.add(str.length());}System.out.println(JSON.toJSONString(list));return list;}// 判断char 是否为中文字符private static boolean isChinesePunctuation(char c) {Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS|| ub == Character.UnicodeBlock.VERTICAL_FORMS) {return true;} else {return false;}}/*** 判断有没有标点符号* @param s* @return*/private static boolean hasSymbol(String s) {boolean b = false;String tmp = s;tmp = tmp.replaceAll("\\p{P}", "");if (s.length() != tmp.length()) {b = true;}return b;}/*** 根据标点符号截取诗句* @param str* @return*/private static List<String> splitBySymbol(String str){StringBuilder sb = new StringBuilder(str);List<Integer> splitSymbolList = takeOutSymbol(str);List<String> list = new ArrayList<>();if(splitSymbolList.size() == 0){list.add(str);return list;}int def = 0;for(int index : splitSymbolList){int indexStart = def;int indexEnd = index;def = indexEnd;String substring = sb.substring(indexStart, indexEnd);System.out.println("add:"+substring);list.add(substring);}return list;}}

这篇关于仿QQ输入法诗人模式格式化字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565671

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep