![](/img/trans.png)
[英]I am trying to convert a string from lower case to upper case and upper case to lower casee
[英]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();
}
}
isLetter
。IntStream
,因此转换为char
。collect
方法中, s
和s1
和s2
的类型是StringBuilder
。这是我运行上面代码时的 output。
eLMAR dIDoKltwDEEE
请注意,保留原始字符串中的空格(因为空格字符既不是大写也不是小写)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.