/*
* 实现文字竖排 Valign.java
*/
public class HengpaiDemo {
public static void main(String[] args) {
/*
* 实现文字竖排 Valign.java
*/
String str="刷卡的将阿四大四大阿四大四大去亲吻";
String s=valign(str,5);
System.out.println(s);
}
public static String valign(String str,int size){
int rows=size;
int cols=str.length()/size;
if(str.length()%size!=0){
cols++;
}
int idx=0;
char[] chs=new char[cols*rows];
for(int i=cols-1;i>=0;i--){
for(int j=0;j<rows;j++){
if(idx==str.length()){
chs[j*cols+i]='~';
}else{
chs[j*cols+i]=str.charAt(idx++);// 某一个位置
}
}
}
String s="";
for(int i=0;i<chs.length;i++){
s+=chs[i];
if((i+1)%cols==0){ //折行
s+='\n';
}
}
return s;
}
}
能否比这个码还能更简练些的,可拿出来晒晒(不包括符号的)
* 实现文字竖排 Valign.java
*/
public class HengpaiDemo {
public static void main(String[] args) {
/*
* 实现文字竖排 Valign.java
*/
String str="刷卡的将阿四大四大阿四大四大去亲吻";
String s=valign(str,5);
System.out.println(s);
}
public static String valign(String str,int size){
int rows=size;
int cols=str.length()/size;
if(str.length()%size!=0){
cols++;
}
int idx=0;
char[] chs=new char[cols*rows];
for(int i=cols-1;i>=0;i--){
for(int j=0;j<rows;j++){
if(idx==str.length()){
chs[j*cols+i]='~';
}else{
chs[j*cols+i]=str.charAt(idx++);// 某一个位置
}
}
}
String s="";
for(int i=0;i<chs.length;i++){
s+=chs[i];
if((i+1)%cols==0){ //折行
s+='\n';
}
}
return s;
}
}
能否比这个码还能更简练些的,可拿出来晒晒(不包括符号的)
if(str.length()%size!=0){
cols++;
}可以改成这样:int cols = (str.length() + size - 1) / size;
String str = "各位啊我的意思是大家也能码个简介的";
String v = valign(str, 5);
System.out.println(v);
} public static String valign(String str, int size) {
char[] chs = str.toCharArray();
int col = (chs.length + size - 1) / size;
int st = (col - 1) * size;
char[] out = new char[(col + 1) * size - 1];
for(int i = 0, k = 0; i < size; i++) {
if(i > 0) {
out[k++] = '\n';
}
for(int j = st + i; j >= 0; j -= size) {
out[k++] = (j >= chs.length) ? '~' : chs[j];
}
}
return new String(out);
}
}实际上用一个循环也能做到,但比较难算一些,呵呵
/*
*
* 实现文字竖排 Valign.java
*/
public class HengpaiDemo
{
public static void main(String[] args)
{
/*
* 实现文字竖排 Valign.java
*/
String str="刷卡的将阿四大四大阿四大四大去亲吻";
String s=valign(str,5);
System.out.println(s);
}
public static String valign(String str,int size)
{
int rows=size;//行数
int cols=str.length()/size;//一行有多少字符
if(str.length()%size!=0)
{
cols++;
}
int idx=0;
StringBuffer sb=new StringBuffer();//创建一个缓冲字符串
for(int i=0;i<rows;i++)
{
for(int j=cols-1;j>=0;j--)
{
idx=i+j*rows;//一次循环获得0|5|10|15 下标 二次循环1|6|11|16|17下标
if(idx<str.length())//是否超过了 文本的字符串的长度
{
sb.append(str.charAt(idx));
}
else
{
sb.append("~");//如果字符够用用‘~’
}
if(j%cols==0)//多少字符后追加回车符号
{
sb.append("\n");
}
}
}
return sb.toString();
}
}
既然楼主挑战简洁
鄙人不才 见笑了 public static String valign(String str, int size) {
int temp = (str.length() - 1) / size + 1;
char[] chars = new char[++temp * size];
char[] source = str.toCharArray();
for(int i = 0; i < chars.length; i++){
chars[i] = temp - i % temp < 2 ? '\n' :
(temp - i % temp - 2) * size + i / temp >= source.length? '~' :
source[(temp - i % temp - 2) * size + i / temp];
}
return new String(chars);
}
char[] chars = str.toCharArray();
int len = chars.length;
int col = (len + size - 1) / size;
char[] data = new char[size * col + size - 1];
for (int i = 0; i < col * size; i++)
data[(i % size) * (col + 1) + (col - 1 - i / size)] = i < len ? chars[i]
: '~';
for (int i = 0; i < size - 1; i++)
data[col + i * (col + 1)] = '\n';
return new String(data);
}