繁体   English   中英

尝试分别将字符串转换为小写/大写

[英]Trying To convert String to lower/upper case respectively

如果字符串是大写的,我正在尝试将其转换为小写,反之亦然。 该代码未按预期工作。 知道我做错了什么吗?

public class LowerNadUpperCase {

    public static void main(String[] args) {
        String output = "Elmar DidOkLTWdeee";
        System.out.println(toAlternativeString(output));
    }

    public static String toAlternativeString(String string) {
        String output = "";
        for(int i = 0; i < string.length(); i++) {
            char c = string.charAt(i);
            if(Character.isLetter(c)){
                if(Character.isLowerCase(c)){
                    output += Character.toUpperCase(c);
                    if(Character.isUpperCase(c)){
                        output += Character.toLowerCase(c);
                    }  else{
                        output += c;
                    }
                }
            }
        }
        return output;
    }
}

使用预定义方法转换试试这个

static void convertOpposite(StringBuffer str)
    {
        int ln = str.length();
 
        // Conversion using predefined methods
        for (int i = 0; i < ln; i++) {
            Character c = str.charAt(i);
            if (Character.isLowerCase(c))
                str.replace(i, i + 1,
                            Character.toUpperCase(c) + "");
            else
                str.replace(i, i + 1,
                            Character.toLowerCase(c) + "");
        }
    }

public static void main(String[] args)
    {
        StringBuffer str = new StringBuffer("asasDAaQWADa");
        convertOpposite(str);
 
        System.out.println(str);
    }

不要采用额外的变量,它将通过替换字符进行转换。

import java.util.*;
public class Main
{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String a=sc.nextLine();
        String res="";
        for(int i=0;i<a.length();i++){
            if(Character.isLowerCase(a.charAt(i))){
                res=res+Character.toUpperCase(a.charAt(i)));
            }
            else{
                res=res+Character.toLowerCase(a.charAt(i)));
            }
        }
        System.out.println(res);
    }
}

所以,你的基本问题在于你的逻辑(我知道,很明显)

if (Character.isLetter(c)) {
    if (Character.isLowerCase(c)) {
        output += Character.toUpperCase(c);
        if (Character.isUpperCase(c)) {
            output += Character.toLowerCase(c);
        } else {
            output += c;
        }
    }
}
  • 如果c不是字母...什么也不做
  • 否则如果c是小写,append 是大写c 现在这是有趣的地方,如果c是大写字母,那不可能,因为我们知道它是小写字母,append(原始) c到 output... 再次

这就是进行“案头检查”(即布置您的变量并手动检查您的代码并写下正在发生的事情)非常强大的地方。

你可能想做的是更像是......

if (Character.isLetter(c)) {
    if (Character.isLowerCase(c)) {
        output += Character.toUpperCase(c);
    } else if (Character.isUpperCase(c)) {
        output += Character.toLowerCase(c);
    }
} else {
    output += c;
}

尽管您可能并不“真的”需要isLetter检查(我的意思是,大写/小写1是什么 ♂️)。

这会让你的方法看起来更像......

public static String toAlternativeString(String string) {
    String output = "";
    for (int i = 0; i < string.length(); i++) {
        char c = string.charAt(i);
        if (Character.isLetter(c)) {
            if (Character.isLowerCase(c)) {
                output += Character.toUpperCase(c);
            } else if (Character.isUpperCase(c)) {
                output += Character.toLowerCase(c);
            }
        } else {
            output += c;
        }
    }
    return output;
}

现在,我知道,在任何人因为String连接的糟糕性能而跳到我的喉咙之前,但我真的不认为这是问题的重点

但以防万一...

public static String toAlternativeString(String string) {
    StringBuilder sb = new StringBuilder(string.length());
    for (char c : string.toCharArray()) {
        if (Character.isUpperCase(c)) {
            sb.append(Character.toLowerCase(c));
        } else {
            sb.append(Character.toUpperCase(c));
        }
    }
    return sb.toString();
}

如果您想在 Java 中进行String连接, StringBuilder “通常”是一个更好的解决方案,但是对于这个示例来说,这可能有些过头了。

因此,采用类似Elmar DidOkLTWdeee 123456的输入,上述方法将 output eLMAR dIDoKltwDEEE 123456

阐述@Dawood ibn Kareem 的评论,您不需要嵌套循环,一个简单的if-else就可以做到。

if(Character.isLetter(c)){
    if(Character.isLowerCase(c)){
        output += Character.toUpperCase(c);
    }
    else {
        output += Character.toLowerCase(c);
    }
}

以下是使用stream API的方法。

import java.util.Objects;

public class LowerAndUpperCase {

    public static void main(String[] args) {
        String output = "Elmar DidOkLTWdeee";
        System.out.println(toAlternativeString(output));
    }

    public static String toAlternativeString(String string) {
        Objects.requireNonNull(string);
        StringBuilder sb = string.chars()
                                 .map(c -> Character.isLowerCase((char) c) ? Character.toUpperCase((char) c) : Character.isUpperCase((char) c) ? Character.toLowerCase((char) c) : (char) c)
                                 .collect(() -> new StringBuilder(),
                                          (s, c) -> s.append((char) c),
                                          (s1, s2) -> s1.append(s2));
        return sb.toString();
    }
}
  • 方法isLowerCase还会检查其方法参数是否为字母,因此无需先调用方法isLetter
  • 方法chars返回一个IntStream ,因此转换为char
  • 映射器返回所提供字符的大写字母(如果它是小写字母)或所提供字符的小写字母(如果它是大写字母)或字符本身(如果它既不是大写字母也不是小写字母)。
  • 在 arguments 到collect方法中, ss1s2的类型是StringBuilder

这是我运行上面代码时的 output。

eLMAR dIDoKltwDEEE

请注意,保留原始字符串中的空格(因为空格字符既不是大写也不是小写)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM