仿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

相关文章

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

springboot日期格式化全局LocalDateTime详解

《springboot日期格式化全局LocalDateTime详解》文章主要分析了SpringBoot中ObjectMapper对象的序列化和反序列化过程,并具体探讨了日期格式化问题,通过分析Spri... 目录分析ObjectMapper与jsonSerializer结论自定义日期格式(全局)扩展利用配置

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用