仿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中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如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. 使用

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素