题目来源: HJ4 字符串分隔
题目描述:
思路
如果字符串的字符个数小于8,则直接补全输出;如果字符串的字符个数大于8,那么先将可以成套输出(8个一组)的部分输出,最后的部分,补全后输出
具体实现:
import java.text.DecimalFormat;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int n = str.length()/8;
char[] chars = new char[(n+1)*8];
if(str.length()<8){
System.out.println((str+"00000000").substring(0,8));
return ;
}
for(int i = 0; i < str.length(); i ++){
char charAt = str.charAt(i);
chars[i] = charAt;
}
for(int i = 0;i < 8 * n; i++){
System.out.print(chars[i]);
if((i+1) % 8 == 0){ //第8个坐标为7,如果是if(i != 0 && i % 8 == 0),第9个就会与前8个在同一行
System.out.println();
}
}
if(str.length()%8 != 0 ){
String str1 = new String(chars,8 * n,str.length()%8);
System.out.println((str1+"00000000").substring(0,8));
}
}
}
思路杂记
1.对于char[] chars = new char[(n+1)*8],其实(n+1)*8并没有什么作用,最初的想法是在数量上按照8个一组进行补全,所以如果后续有需要计算补全后的长度,那么直接使用chars.length即可。
2.第一个if判断,就是思路中的字符个数小于8的情况,简单粗暴的在str后面+"00000000",然后通过public String substring(int beginIndex, int endIndex)返回字符串的子字符串,beginIndex是起始索引(包括), 索引从 0 开始;endIndex是结束索引(不包括)。
因为beginIndex是从0开始,endIndex又不包括在内,所以可以将endIndex这个参数简单粗暴的看作是需要获得的字符串中子字符串的个数
3.正如代码中的注释,对于第2个for循环中的if语句,最初的想法是if(i != 0 && i % 8 == 0),因为i是从0开始的,所以if语句中需要i != 0,否则就会出现图1的情况,第1个字符独占一行,由于if语句在i == 0时是TRUE,输出了System.out.println(),所以第一组的后7个就会在第二行。
添加上i != 0,如果字符个数≤8是没有问题的,但是,如果超过8个,就会出现新的问题:而根据输入的字符个数不同(8个一组,与满足几组有关),会有不同的错误输出情况,这里只讲一下8<个数<16以及16<个数<24的情况
- 对于前者,由于if语句外层的for循环中的
i < 8 * n,所以当8<个数<16时,n=str.length()/8 == 1,所以当i==8时,无法通过for语句中的i < 8 * n,也就不会执行if语句中的System.out.println(),就会出现图2的情况,后面添加那么多0,是代码中最后一个if语句的效果,正确的输出是:前8个字符第一行,第9个字符后面添加7个0处于第2行,由于没有执行System.out.println(),就没有完成换行的功能 - 对于后者,出现一个新情况,发现第9个字符与前8个字符处于同一行,如图3,这是因为第8个字符坐标为i==7,而
if(i != 0 && i % 8 == 0),第9个的坐标i == 8,所以if条件成立,会在第9个字符后执行System.out.println(),由于for循环中是先输出字符,后if判断,所以就会将第9个字符先进行输出,这样第9个与前8个在同一行,然后进行换行;至于输出部分的第二行的错误情况,与8<个数<16是同理的,因为此时n=str.length()/8 == 2,可以根据上面对8<个数<16的分析,进行理解
4.对于最后一个if语句,用到了String类中构造方法String(char value[], int offset, int count),offset表示第一个被截取的字符在数组value[]中的下标,count表示从此字符开始向后截取的字符的数量,理解为将value[]数组按照传入的下标和指定的截取数组数据的数量进行截取,并且创建一个内容为此的string对象。
5.最后一个if语句,它的功能就是将原字符串中不够8个的字符,进行添加0,还可以用另一种方法实现
if(str.length()%8 != 0 ){
DecimalFormat decimalFormat = new DecimalFormat("0.0000000"); //后添加0
String str1 = decimalFormat.format(Integer.valueOf(new String(chars,8 * n,str.length()%8)));
System.out.println(str1.replace(".","").substring(0,8));
}
上述代码其实就是先通过decimalFormat.format完成字符串后面添加0,由于多了一个小数点,再通过replace将小数点去掉,最后使用substring返回符合个数的子字符串
JAVA字符串前补零和后补零的快速方法
-
- 数字字符串替换方法:
String str= "123456";
System.out.println("================ 前补零方法1 =================");
DecimalFormat decimalFormat=new DecimalFormat("0000000");
String startZeroStr = decimalFormat.format(Integer.valueOf(str));
System.out.println("前补零方法一:"+startZeroStr);
System.out.println("==前补零 方法2,此方法不能对非数字字符串替换==");
startZeroStr = String.format("%07d",Integer.valueOf(fileName));
System.out.println("前补零方法二:"+startZeroStr);
System.out.println("================ 后补零 方法1 =================");
DecimalFormat decimalFormat1=new DecimalFormat("0.000000");
String endZeroStr = decimalFormat1.format(Integer.valueOf(fileName));
System.out.println("后补零:"+endZeroStr);
System.out.println("虽然后补零出现这种情况,带有小数点");
System.out.println("比如你要长度要在7位以内,可以这么做");
System.out.println("后补零转变后:"+endZeroStr.replace(".","").substring(0,7));
其中,后补零,还可以像这道题前面的方法:就是后边多补几个零,然后截取就行了
System.out.println((str+"00000000").substring(0,8));
- 2.非数字字符串前补零:
对非数字字符串前补零,用
%4d替换肯定是不行的,因为%d对应的就是数字格式,如果想对AA字符串前补零到4位,可以这样写:先对字符串转,以空格补满位数,然后再将空格整体替换为目标0
String.format("%4s", "AA").replace(" ","0")
//%4s中的4:填充为4位,对于不够的地方,%s是字符串,填充的是空格,所以需要用replace替换
String.format 传入 %XYd 的意思,拆解如下:
%d :正常输出十进制数
%Yd:十进制数,输出 Y 位。如果本身大于 Y 位,正常输出
%XYd:十进制数,输出 Y 位,不足 Y 位就补 X 。如果本身大于 Y 位,正常输出
相关知识点,可以搜索Java占位符使用