• Text Justification,文本对齐


    问题描述:把一个集合的单词按照每行L个字符放,每行要两端对齐,如果空格不能均匀分布在所有间隔中,那么左边的空格要多于右边的空格,最后一行靠左对齐。

    words: ["This", "is", "an", "example", "of", "text", "justification."]
    L: 16.

    Return the formatted lines as:

    [
       "This    is    an",
       "example  of text",
       "justification.  "
    ]


    public class TextJustification {
    	public ArrayList<String> fullJustify(String[] words, int L) 
    	{
    	    ArrayList<String> res = new ArrayList<String>();
    	    if(words==null || words.length==0)
    	        return res;
    	    int count = 0;//当前行字符串长度和
    	    int last = 0;//每一行头元素下标
    	    for(int i=0;i<words.length;i++)
    	    {
    	        //count是上一次计算的单词的长度,words[i].length()是当前尝试放的一个单词的长度,
    	        //假设当前放上了这个单词,那么这一行单词跟单词间的间隔数就是i-last
    	        //判断这些总的长度加起来是不是大于L(超行数了)
    	        if(count + words[i].length() + (i-last) > L)
    	        {
    	            int spaceNum = 0;
    	            int extraNum = 0;
    	            //因为尝试的words[i]失败了,所以间隔数减1.此时判断剩余的间隔数是否大于0
    	            if( i-last-1 >0)
    	            {
    	                //是间隔的倍数(为啥要减1,因为尝试当前words[i]后发现比L长了,
    	                //所以当前这个单词不能算作这行,所以间隔就减少一个
    	                spaceNum = (L-count)/(i-last-1);
    	                extraNum = (L-count)%(i-last-1);//不是倍数的话还要计算
    	            }
    	            StringBuilder str = new StringBuilder();
    	            for(int j=last;j<i;j++)
    	            {
    	                str.append(words[j]);
    	                if(j<i-1)
    	                {//words[i-1]的话后面就不用填空格了,所以这里j<i-1
    	                    for(int k=0;k<spaceNum;k++)
    	                        str.append(" ");
    	                    
    	                    if(extraNum>0)
    	                    {    
    	                    	str.append(" ");
    	                    	extraNum--;
    	                    }
    	                }
    	            }
    	            
    	            //下面这个for循环作用于一行只有一个单词还没填满一行的情况
    	            for(int j=str.length();j<L;j++)
    	                str.append(" ");
    	                
    	            res.add(str.toString());
    	            count=0;
    	            last=i;//下一个开始的单词
    	        }//if
    	        count += words[i].length();
    	    }//for
    	    
    	    //处理最后一行
    	    StringBuilder str = new StringBuilder();
    	    for(int i=last;i<words.length;i++)
    	    {
    	        str.append(words[i]);
    	        if(str.length()<L)
    	            str.append(" ");
    	    }
    	    for(int i=str.length();i<L;i++)
    	        str.append(" ");
    	    
    	    res.add(str.toString());
    	    return res;
    	}
    	public static void main(String[] args) {
    		String[] words = {"This", "is", "an", "example", "of", "text", "justification."};
    		int l = 16;
    		TextJustification tj = new TextJustification();
    		ArrayList<String> list = tj.fullJustify(words, l);
    		for (String string : list) {
    			System.out.println(string);
    		}
    	}
    }
    
  • 相关阅读:
    第三周学习进度条
    软件工程个人作业02
    构建之法阅读笔记02
    学习进度条
    构建之法阅读笔记01
    软件工程个人作业01
    构建之法粗读
    第一次作业
    动手动脑接口与继承
    大道至简第七章第八章
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5780871.html
Copyright © 2020-2023  润新知