仿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

相关文章

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su