68.文本左右对齐

给定单词数组和最大宽度maxWidth,该问题要求将单词排列成每行宽度不超过maxWidth,且左右两端对齐。空格应均匀分配,若无法均匀分配则左边空格多于右边。最后一行应左对齐,且单词间无额外空格。示例展示了不同情况下的排列方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
尽可能多地往每行中放置单词,要求均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。

说明:
单词是指由非空格字符组成的字符序列。
每个单词的长度大于 0,小于等于 maxWidth。
输入单词数组 words 至少包含一个单词。

示例:
输入:
words = [“This”, “is”, “an”, “example”, “of”, “text”, “justification.”]
maxWidth = 16
输出:
[
“This    is    an”,
“example  of text”,
"justification.     "
]

示例 2:
输入:
words = [“What”,“must”,“be”,“acknowledgment”,“shall”,“be”]
maxWidth = 16
输出:
[
“What   must   be”,
"acknowledgment  ",
"shall be          "
]
解释: 注意最后一行的格式应为 "shall be " 而不是 “shall be”,
因为最后一行应为左对齐,而不是左右两端对齐。
第二行同样为左对齐,这是因为这行只包含一个单词。

示例 3:
输入:
words = [“Science”,“is”,“what”,“we”,“understand”,“well”,“enough”,“to”,“explain”,
“to”,“a”,“computer.”,“Art”,“is”,“everything”,“else”,“we”,“do”]
maxWidth = 20
输出:
[
“Science  is  what we”,
“understand       well”,
“enough  to explain to”,
“a  computer.  Art  is”,
“everything   else  we”,
"do                  "
]

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
    	//一行单词数量
        int wordsCountPerRow = 0;
        //一行单词长度(不包括空格)
        int wordsWidth = 0;
        //存放一行单词
        String[] wordsArr = new String[words.length];
        //下标
		int wordsArrIndex = 0;
		//对齐的文本
        String row = new String();
        List<String> strList = new ArrayList<>();
        //从左向右遍历单词
        for(int i = 0; i < words.length; i++) {
        	//判断添加下一个单词长度是否超出限制(加上两单词间至少的一个空格)
            boolean isMax = wordsWidth + words[i].length() + wordsCountPerRow > maxWidth;
            //不超出
            if(!isMax) {
                wordsCountPerRow++;
                wordsWidth += words[i].length();
                wordsArr[wordsArrIndex++] = words[i];
            }
            //超出 或 添加了最后一个单词
            if(isMax || i==words.length-1) {
            	//保证能遍历到这次添加会超出限制的单词
                if(isMax)
                    i--;
                //对齐文本
                for(int j = 0; j < wordsCountPerRow; j++) {
                    row += wordsArr[j];
                    //一个单词为一行 或 最后一行 文本
                    //除了最后一个单词,每个单词后添加一个空格
                    if(1==wordsCountPerRow || i==words.length-1) {
                        if(j != wordsCountPerRow-1)
                            row += " ";
                    //常规情况
                    //除了最后一个单词,每个单词后均分空格
                    } else {
                        if(j != wordsCountPerRow-1) {
                        	//平均空格数
                            int temp1 = (maxWidth - wordsWidth) / (wordsCountPerRow - 1);
                            //均分空格后剩余的空格数
                            int temp2 = maxWidth - (wordsWidth + ((wordsCountPerRow - 1) * temp1));
                            //添加均分的空格
                            for(int k = 0; k < temp1; k++)
                                row += " ";
                            //从左向右将剩余空格逐个添加于每个单词后
                            if(j < temp2)
                                row += " ";
                        }
                    }
                }
                //在 一个单词为一行 或 最后一行 的文本尾部补满空格
                int temp = maxWidth - row.length();
                for(int j = 0; j < temp; j++)
                    row += " ";
                
                wordsCountPerRow = 0;
                wordsWidth = 0;
				wordsArrIndex = 0;
                strList.add(row);
                row = new String();
            }
        }
        return strList;
    }
}
<think>好的,我现在需要帮助用户解决在Java中使用String.format实现右对齐的问题。首先,我得回忆一下String.format的用法,特别是格式化字符串的语法。用户提到右对齐,所以应该涉及到宽度和格式说明符的调整。 根据之前的引用内容,特别是引用[2]和[5],String.format类似于printf,使用格式说明符。右对齐通常是通过指定一个宽度并在前面补空格或其他字符实现的。例如,%10s会将字符串格式化为宽度10,右对齐,左边补空格。如果是数字,比如整数或浮点数,可能需要使用类似%10d或%10.2f这样的格式。 接下来,我需要确认如何具体应用这些格式。用户可能需要不同的示例,比如字符串、整数、带有前导零的情况,以及更复杂的组合情况。例如,使用%10s右对齐字符串,%-10s则是左对齐,所以右对齐不需要负号。对于数字,除了宽度,还可以指定千位分隔符,如引用[4]中的金额格式化示例,用了逗号分隔符。 另外,用户可能需要知道如何用零填充而不仅仅是空格。这时候格式说明符可能需要类似%010d,这样数字会用零填充到10位宽度,右对齐。例如,数字123格式化为%010d会变成0000000123。 还需要考虑不同数据类型,比如浮点数,如何同时控制小数位数和对齐方式。例如,%10.2f会右对齐,总宽度10,保留两位小数。同时,货币格式化的例子中使用了$%,.2f,这里的逗号可能作为千位分隔符,而右对齐可能需要结合宽度参数。 然后,我应该整理这些情况,给出具体的示例代码,并解释每个参数的作用。例如,System.out.println(String.format("右对齐字符串:'%10s'", "Hello")); 会输出' Hello',前面有5个空格。对于数字,System.out.println(String.format("右对齐数字:%10d", 123)); 结果为' 123'。 还需要注意,当数值的位数超过指定宽度时,宽度会自动扩展,不会截断数据。例如,如果数字是1234567890,而宽度是5,那么实际输出会超过5位,保持完整数字。 此外,用户可能想了解如何同时使用其他格式选项,比如千位分隔符和右对齐。例如,金额格式化可能需要%,.2f,同时指定宽度,如%15,.2f,这样数字会右对齐,总宽度15,包括逗号和两位小数。 最后,应该总结右对齐的实现方法,强调在格式字符串中使用宽度参数,并说明如何结合其他格式标志如零填充、逗号分隔符等。同时,提醒用户注意参数顺序和语法,确保格式说明符正确无误。</think>在Java中,使用`String.format()`实现右对齐格式化主要通过**指定字段宽度**和**格式说明符组合**实现。以下是具体实现方法和示例: --- ### 一、基础右对齐格式 在格式字符串中使用`%N`指定字段宽度,其中`N`表示总占位字符数: ```java // 字符串右对齐(默认空格填充) System.out.println(String.format("右对齐字符串:'%10s'", "Hello")); // 输出:' Hello' // 数字右对齐(整数) System.out.println(String.format("右对齐数字:%10d", 123)); // 输出:' 123' // 浮点数右对齐(保留两位小数) System.out.println(String.format("右对齐浮点数:%10.2f", 123.456)); // 输出:' 123.46' ``` --- ### 二、带前导零的右对齐 在宽度参数前加`0`,实现**零填充**右对齐: ```java // 数字右对齐补零 System.out.println(String.format("补零右对齐:%010d", 123)); // 输出:'0000000123' // 浮点数补零右对齐 System.out.println(String.format("补零浮点数:%010.2f", 123.45)); // 输出:'0000123.45' ``` --- ### 三、结合千位分隔符 通过`,`标志添加千位分隔符并右对齐: ```java // 数字右对齐+千位分隔符 System.out.println(String.format("千位分隔:%,15d", 1234567)); // 输出:' 1,234,567' // 浮点数右对齐+千位分隔符+两位小数 System.out.println(String.format("金额格式:$%,15.2f", 1234.56)); // 输出:' $1,234.56' ``` --- ### 四、混合格式组合 可叠加使用符号、正负号等格式标志: ```java // 带符号右对齐(正数显示+,负数显示-) System.out.println(String.format("符号标记:%+10d", 25)); // 输出:' +25' // 负数特殊标记(括号表示负数) System.out.println(String.format("负数标记:%(10d", -50)); // 输出:' (50)' ``` --- ### 参数说明表 | 格式说明符 | 作用 | 示例输入 | 输出(宽度10) | |------------------|-------------------------------|----------------|--------------------| | `%10s` | 字符串右对齐(空格填充) | `"Text"` | `' Text'` | | `%10d` | 整数右对齐 | `123` | `' 123'` | | `%010d` | 整数右对齐补零 | `123` | `'0000000123'` | | `%,10d` | 整数右对齐+千位分隔符 | `123456` | `' 123,456'` | | `%10.2f` | 浮点数右对齐+两位小数 | `123.456` | `' 123.46'` | | `%+10d` | 右对齐+显示符号 | `25` | `' +25'` | --- ### 注意事项 1. **宽度溢出处理**:若数值位数超过指定宽度,仍会完整显示(如`%5d`格式输出`123456`时显示`123456`)[^2] 2. **多语言支持**:千位分隔符和货币符号会根据`Locale`自动变化(如使用`String.format(Locale.FRANCE, "%,d", 1234)`输出`1 234`)[^3] 3. **性能优化**:频繁格式化时建议复用`Formatter`对象而非反复调用`String.format()`[^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值