在增加/减少字母字符时如何使换行符保持不变?

时间:2018-07-21 02:15:03

标签: java

我有一个字符串如下:

String sentence = "I have 20 apples.\n" +
                   "Kevin has 15 apples.\n" +
                   "Peter has nothing."

我想将每个字母字符增加2,而其他字符(空格,特殊字符,换行符等)保持不变。

这是我写的程序。

public static void incrementCharacters(String sentence) {
    BufferedReader reader = new BufferedReader(new StringReader(sentence));
    StringBuilder str = new StringBuilder();

    while((line=reader.readLine()) != null){
        for(int i =0; i < line.length(); i++){
            char ch = line.charAt(i);
            if(Character.isAlphabetic(ch)){
                if(Character.isUpperCase(ch){
                    str.append(Character.toUpperCase((char)(ch + 2)));

                } else {
                    str.append(Character.toLowerCase((char)(ch + 2));           
                }

            } else {
               str.append(ch);
            }

        }

    }
    System.out.println(str);
}

但是我得到的输出是“我有20个苹果。Mgxkpjcu 15 crrngu.Rgvgt icu pqvjkpi”。省略换行符。 如何修改该程序,以便在输出中包含新行?

4 个答案:

答案 0 :(得分:1)

我不理解您对BufferedReaderCharacter.toUpperCase()的使用。只需遍历您的字符串,然后将每个字母即2个字符加2到StringBuilder,然后返回结果即可。

public class MyClass {
    public static void main(String args[]) {
        String sentence = "I have 20 apples.\n" +
                   "My friend has 15 apples.\n" +
                   "My cousin has nothing.";

        System.out.println(incrementCharacters(sentence));           

    }

    public static String incrementCharacters(String sentence) {
        StringBuilder sb = new StringBuilder();
        for (char c : sentence.toCharArray()) {
            sb.append(Character.isLetter(c) ? (char)(c + 2) : (char)c);
        }

        return sb.toString();
    }
}

结果:

K jcxg 20 crrngu.
O{ htkgpf jcu 15 crrngu.
O{ eqwukp jcu pqvjkpi.

答案 1 :(得分:0)

因为您使用的是BufferedReader,当您致电readLine时,它将删除换行符。

您不需要BufferedReader,只需迭代sentence中的每个字符。

public static void incrementCharacters(String sentence) {
    StringBuilder str = new StringBuilder();
    for(int i = 0; i < sentence.length(); i++) {
        char ch = sentence.charAt(i);
        if(Character.isAlphabetic(ch)) {
            str.append((char) (ch + 2));
        } else {
            str.append(ch);
        }
    }
    System.out.println(str);
}

答案 2 :(得分:0)

BufferedReader.readline()删除换行符。由于您知道这种情况会在while循环的每次迭代中发生,因此一种解决方案是将换行符重新插入到输出中。在内部for循环之后,您可以轻松地做到这一点。

答案 3 :(得分:0)

这是因为您正在调用readLine()。行由\ n分隔,因此它们不包含在readLine()的结果中。这样做

public static void incrementCharacters(String sentence) throws IOException {
    BufferedReader reader = new BufferedReader(new StringReader(sentence));
    StringBuilder str = new StringBuilder();
    String line;

    while((line=reader.readLine()) != null){
        for(int i =0; i < line.length(); i++){
            char ch = line.charAt(i);
            if(Character.isAlphabetic(ch)){
                if(Character.isUpperCase(ch)){
                    str.append(Character.toUpperCase((char)(ch + 2)));
                } else {
                    str.append(Character.toLowerCase((char)(ch + 2)));
                }
            } else {
                str.append(ch);
            }
        }
        str.append("\n"); // just add this
    }

    System.out.println(str);
}