我想更改一个String,以便所有大写字符变为小写,并且所有小写字符都变为大写。数字字符只是被忽略。
所以“AbCdE123”变成“aBcDe123”
我想必须有一种方法来遍历String并翻转每个字符,或者可能是一些可以执行此操作的正则表达式。
答案 0 :(得分:20)
Apache Commons StringUtils有一个swapCase方法。
答案 1 :(得分:16)
我不相信有任何内置的东西(这是相对不寻常的)。这应该这样做:
public static String reverseCase(String text)
{
char[] chars = text.toCharArray();
for (int i = 0; i < chars.length; i++)
{
char c = chars[i];
if (Character.isUpperCase(c))
{
chars[i] = Character.toLowerCase(c);
}
else if (Character.isLowerCase(c))
{
chars[i] = Character.toUpperCase(c);
}
}
return new String(chars);
}
请注意,这不会执行String.toUpperCase / String.toLowerCase所做的特定于语言环境的更改。它也不处理非BMP字符。
答案 2 :(得分:2)
我想必须有一种方法来遍历字符串并翻转每个字符
正确。 java.lang.Character
类为您提供了isUpperCase()
方法。对其进行测试,并根据结果使用toLowerCase()
或toUpperCase()
方法。将每个结果附加到StringBuilder
,您应该没问题。
答案 3 :(得分:2)
基于Faraz的方法,我认为字符转换可以简单如下:
t += Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);
答案 4 :(得分:1)
Java 8及更高版本:
String myString = "MySampleString123";
System.out.println(myString.chars().map(c -> Character.isLetter(c) ? c ^ ' ' : c).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString());
需要注意的是颠倒字母大小写的代码:
Character.isLetter(c) ? c ^ ' ' : c
答案 5 :(得分:0)
我们也可以使用StringBuilder对象,因为它有字符替换方法。但是,可能需要一些额外的空间来存储StringBuilder对象。因此,如果空间无关紧要并且使解决方案易于理解,那将会有所帮助。
String swapCase(String text) {
StringBuilder textSB = new StringBuilder(text);
for(int i = 0; i < text.length(); i++) {
if(text.charAt(i) > 64 && text.charAt(i) < 91)
textSB.setCharAt(i, (char)(text.charAt(i) + 32));
else if(text.charAt(i) > 96 && text.charAt(i) < 123)
textSB.setCharAt(i, (char)(text.charAt(i) - 32));
}
return textSB.toString();
}
答案 6 :(得分:0)
public class ReverseCase {
public static void main(String[] args){
char[] char_arr = args[0].toCharArray();
for (int i = 0; i < char_arr.length; i++) {
if (Character.isLowerCase(char_arr[i])) {
char_arr[i] = Character.toUpperCase(char_arr[i]);
}else {
char_arr[i] = Character.toLowerCase(char_arr[i]);
}
}
String reversed = new String(char_arr);
System.out.println(reversed);
}
}
答案 7 :(得分:0)
我认为最容易理解的解决方案是:
#include <sw/redis++/redis++.h>
#include<iostream>
using namespace sw::redis;
using namespace std;
struct person
{
int age;
string name;
};
int main(){
person p1;
p1.age=18;
p1.name="Abhishek";
try{
auto redis_cluster = RedisCluster("tcp://127.0.0.1:30001");
redis_cluster.set("person",StringView(&p1,size_t(sizeof(person))));
auto reply=redis_cluster.get("person");
if(reply){
person* p2=*reply;
cout<<p2->age<<endl;
}
} catch(const Error &e){ cout<<"Error"<<endl;
}
}
我认为您可以更轻松地阅读它,并且StringBuilder无论如何都具有append(char)方法+ public static String reverseCase(String text) {
StringBuilder sb = new StringBuilder();
for (char c : text.toCharArray())
sb.append((Character.isUpperCase(c)) ?
Character.toLowerCase(c) :
(Character.isLowerCase(c) ? Character.isUpperCase(c) : c));
return sb.toString();
}
和Character.toUpperCase
都是静态方法。我感到很遗憾,唯一的StringBuilder示例也包含了ascii索引算法。
对于那些不喜欢三元表达式的人,这是等效的:
toLowerCase
答案 8 :(得分:-1)
我确实认识到给定的线程已经很老了,但有一种更好的解决方法:
class Toggle
{
public static void main()
{
String str = "This is a String";
String t = "";
for (int x = 0; x < str.length(); x++)
{
char c = str.charAt(x);
boolean check = Character.isUpperCase(c);
if (check == true)
t = t + Character.toLowerCase(c);
else
t = t + Character.toUpperCase(c);
}
System.out.println (t);
}
}