按字符串maxLines参数和字符数剪切字符串

时间:2017-12-05 19:20:36

标签: java string

我正在编写一个类,该方法采用汇总字符串并将其分解为最大行数(maxLines参数)和每行最大字符数(width参数)。除第一行之外的所有行都应缩进(它们应以空格字符开头),但缩进行中的第二个字符不应该是另一个空格(因此不得包含第二个空格)。如果更改maxLine参数r width,程序仍然可以工作。

此外,代码应检查字符串中是否有一些特殊字符,如:

 \' , \" , \\ , \t , \b , \r , \f , \n 

我如何检查String中的许多空格如下?如果String中有很多空格,我想修剪它们,但我不知道如何。 (这些下划线代表空格。)

"9:00 John_____________________________Doe until 10 30 at Office"

9:00 Jo
_hn____
_______
_____Do

使用我的代码,我得到了这个结果:

 9:00 Jo
 _hn Doe
 _until 1
 _0 30 at

但我想要这个输出:

9:00 Jo
_hn Doe
_until_
_10 30_

这是我的代码:

public static void main(String[] args) {

    String str = "9:00 John Doe until 10 30 at Office";
    int width = 7;
    int maxLine = 4;
    List<String> lisT = new LinkedList<>(getParts(str, width, maxLine));
    for (String part : lisT) {
        System.out.println(part);
    }
}

public static List<String> getParts(String str, int width, int maxLine) {
    List<String> parts = new LinkedList<>();
    int count = 0;
    int len = str.length();
    String indent = "";
    for (int i = 0; i < len; i += width) {
        parts.add(indent + str.substring(i, Math.min(len, i + width)).trim());
        count++;
        indent = " ";
        if (count == maxLine)
            break;
    }
    return parts;
}

2 个答案:

答案 0 :(得分:1)

所以这就是你想要的?我真的希望你不必在某些事情上实现这一点,因为我不得不破坏它以使其发挥作用。希望这是家庭作业

public static void main(String[] args) {
    String str = "9:00 John Doe until 10 30 at Office";
    int width = 7;
    int maxLine = 4;
    List<String> lisT = new LinkedList<>(getParts(str, width, maxLine));
    for (String part : lisT) {
        System.out.println(part);
    }
}

public static List<String> getParts(String str, int width, int maxLine){
    List<String> parts = new LinkedList<>();
    int endedAt = 0;
    boolean firstLine = true;
    boolean secondLine = true;
    String indent = " ";
    for (int i = 0; i < maxLine; i++) {
        if(endedAt<=str.length()) {
            String holder;
            if(firstLine) {
                holder = str.substring(endedAt, endedAt + width);
                firstLine = false;
            }
            else {
                if(secondLine){
                    width = width -1;
                    secondLine = false;
                }
                holder = indent + str.substring(endedAt, endedAt + width).trim();
            }
            parts.add(holder);
            endedAt = endedAt + width;
        }
    }
    return parts;
}

输出

9:00 Jo
 hn Doe
 until
 10 30

答案 1 :(得分:0)

我认为您的行可能太长,因为您的width = 7包含缩进空格,因此您的行的宽度为8而不是7.我会尝试将for (int i = 0; i < len; i += width) {...替换为for (int i = 1; i < len; i += width - 1) {...并在第0行的for循环之前添加一个特殊语句,因为您不想缩进第0行。像这样:

parts.add(str.substring(0, Math.min(len, i + width)).trim());
    for(...){...}

让我知道这似乎是问题所在。如果没有,我可以再看看。回答你的其他问题:

要删除字符串中间的多个空格,请使用此空格将所有空格替换为一个空格:

String result = replaceAll("\\s","");

您可以使用以下正则表达式删除特殊字符:

String result = str.replaceAll("[\'\"\\\t\b\r\f\n]","");