簡體   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