更改java中字符的大小写

更改java中字符的大小写,java,unicode,mapping,uppercase,lowercase,Java,Unicode,Mapping,Uppercase,Lowercase,如果我想创建一个用户可以创建自定义字母表(仍然使用unicode)的字典,有没有办法更改字符的小写和大写映射 假设我希望'I'的小写字母是'I'而不是'I',或者'b'的大写字母是'p'而不是'b',这样System.out.println(“PAI.toLowerCase())将baı写入控制台 我想我可以创建一个方法toLowerCase(strings),首先将“p”替换为“b”,然后转换为小写,但在搜索数十万个单词的字典时,这不是会更慢吗 toLowerCase(String s)使用区

如果我想创建一个用户可以创建自定义字母表(仍然使用unicode)的字典,有没有办法更改字符的小写和大写映射

假设我希望'I'的小写字母是'I'而不是'I',或者'b'的大写字母是'p'而不是'b',这样
System.out.println(“PAI.toLowerCase())
baı
写入控制台


我想我可以创建一个方法
toLowerCase(strings)
,首先将“p”替换为“b”,然后转换为小写,但在搜索数十万个单词的字典时,这不是会更慢吗

toLowerCase(String s)使用区域设置来决定如何转换字符,您应该定义自己的,然后,例如,在执行
toLowerCase(String s)
之前,通过
locale.setDefault(locale)
将其加载为默认区域设置,它不会变慢,因为您只是遍历数组,而不会修改任何对象的位置,这将导致O(n)。性能不会受到影响,任何系统都应该能够轻松地处理单个转换,然后
toLowerCase
调用

您还可以重写
toLowerCase(String s)
函数以满足您的需要。更简单

检查此项您不能从String类继承,因为它是final,但您可以使用toLowerCase方法创建类,我建议您调用different进行维护

还有数十万字的字典。。。。 也许你使用了一个或,键将是用户输入的字符串,你可能会在对象中自动保存小写的值,这取决于你需要什么

但为了获得更好的性能,我建议将值保存在数据库中


问候

这应该可以做到:

import java.util.HashMap;
import java.util.Map;

class MyString {

    String string;
    static final Map<Character, Character> toLowerCaseMap, toUpperCaseMap;

    static {
        toLowerCaseMap = new HashMap<>();
        toLowerCaseMap.put('I', '|');

        toUpperCaseMap = new HashMap<>();
        toUpperCaseMap.put('b', 'P');
    }

    MyString(String string) {

        this.string = string;
    }

    String toLowerCase() {

        char[] chars = string.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            chars[i] = toLowerCaseMap.containsKey(c) ? toLowerCaseMap.get(c) : Character.toLowerCase(c);
        }

        return new String(chars);
    }

    String toUpperCase() {

        char[] chars = string.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            chars[i] = toUpperCaseMap.containsKey(c) ? toUpperCaseMap.get(c) : Character.toUpperCase(c);
        }

        return new String(chars);
    }
}
import java.util.HashMap;
导入java.util.Map;
类MyString{
字符串字符串;
静态最终地图toLowerCaseMap、ToUpper CaseMap;
静止的{
toLowerCaseMap=新HashMap();
toLowerCaseMap.put('I','|');
toUpperCaseMap=新HashMap();
toUpperCaseMap.put('b','P');
}
MyString(字符串){
this.string=string;
}
字符串toLowerCase(){
char[]chars=string.toCharArray();
for(int i=0;i
我的直觉是,它比在一本包含数十万个单词的字典中搜索要快……我所说的方法将首先替换然后使用toLowerCase()它怎么能更快?如果你已经想出了一个更快的方法,请解释。答案很好,但我建议使用
到小写(locale)
一个人不能定义自己的
语言环境
:构造函数是
私有的
,扩展也是不可能的,因为类是
最终的
。后者也适用于
String
类。您不能重写
toLowerCase
,因为
String
类是
final
。我需要对此进行详细说明。在我有10个自定义映射的情况下,我需要调用
string.replaceAll(大写,小写)10次。这怎么会不慢呢down@HummelingEngineering我们不能重写
String.toLowerCase()
,但我们可以重写定制的
toLowerCase(String s)
methodTrue,我忘了。上面的答案提到创建自己的字符串类实现,这是更好的答案。@WVrock是的,但这仍然只是遍历数组,而不是修改该数组中任何数据的位置。你只是简单地对一个角色执行两个动作,然后继续执行下一个动作,所以你不会看到一个性能上的成功。当然,完成转换的时间会随着提供的词典的大小而增加,但这不是一个大问题,也没有办法解决。键的映射不起作用。我希望半书写的单词能够找到最接近的匹配项。就像“学校”找到“学校”。这个答案恐怕超出了我的java知识范围。也许有一天我会试试。看来我看错了答案。使用字符串包装器(在性能上)与创建toLowerCase(字符串s)方法没有什么不同。因此,为了实现这一功能,我建议您尝试使用数据库层实现逻辑,因为当用户输入到数据库并搜索“user\u Input\u%”之类的WHERE字段时,您可以附加一个偶数侦听器,所以我做了基准测试,这与简单地执行“PAI.toLowerCase()所用的时间大致相同;虽然我不确定是应该使用字符串包装器还是创建静态StringManager。@WVrock不要打断你的头,两个都试试!