Java 如何将新值添加到现有大小写中

Java 如何将新值添加到现有大小写中,java,arrays,string,Java,Arrays,String,我正在开发一种将ArrayList作为参数的方法。 然后,该方法对数组进行一些更改并返回转换后的arrayList。 输入数组类似于{A123,C123,15B2},我想得到以下输出{Aa123,Cc123,15Bb2} 也就是说,在任何大写字母之后,我需要添加相同的小写字母 字母的顺序和数量是任意的,例如,也可以得到像Hkjk124、hy71这样的字符串 方法如下所示: protected ArrayList<String> enrichValues(ArrayList<St

我正在开发一种将ArrayList作为参数的方法。 然后,该方法对数组进行一些更改并返回转换后的arrayList。 输入数组类似于{A123,C123,15B2},我想得到以下输出{Aa123,Cc123,15Bb2}

也就是说,在任何大写字母之后,我需要添加相同的小写字母

字母的顺序和数量是任意的,例如,也可以得到像Hkjk124、hy71这样的字符串

方法如下所示:

protected ArrayList<String> enrichValues(ArrayList<String> list) {
    for (int i = 0; i < list.size(); i++) {
        char[] charArray = list.get(i).toCharArray();

        List<Character> listChars = new ArrayList<>();

        for (char c : charArray) {
            listChars.add(c);
        }

        for (int j = 0; j < listChars.size(); j++) {
            if (listChars.get(j).charValue() == 'A') {
                listChars.add(j + 1, 'a');
            }
        }

        String newChar = "";

        for (Character c : listChars)
            newChar += c.toString();

        list.set(i, newChar);
    }
    return list;
}
因此,我必须添加大量支票:

if (listChars.get(j).charValue() == 'B') {
    listChars.add(j + 1, 'b');
}
if (listChars.get(j).charValue() == 'C') {
    listChars.add(j + 1, 'c');
}

但这是一种非常糟糕的方法。如果有任何帮助,我将不胜感激。

要了解字母是否为大写,您只需使用ASCII字母表即可。大写字符从65到90

因此,您只需要在字符串长度上使用一个循环,并检查每个字符的ASCII值是否在65到90之间。假设变量temp是字符串中的一个字符,它看起来是这样的:

if((int)temp >= 65 && (int)temp <= 90){
//Add the lower case character by adding 22 to the character value (lower case are from 97-122)
char additionalChar = ((int)temp)+22;
}

如果((int)temp>=65&&(int)temp有一种更简单的方法可以使用正则表达式实现这一点:

final ArrayList< String > outputList = new ArrayList<>();

for ( String str : list ) {
    final String[] letters = str.replaceAll( "[^A-Z]", "" ).toLowerCase().split( "" );

    final String result = String.format( str.replaceAll( "([A-Z])", "$1%s" ), letters );

    outputList.add( result );
}

return outputList;
final ArrayListoutputList=new ArrayList();
for(字符串str:list){
最后一个字符串[]字母=str.replaceAll(“[^A-Z]”),toLowerCase().split(“”);
最终字符串结果=String.format(str.replaceAll(“([A-Z])”,“$1%s”),字母);
outputList.add(结果);
}
返回输出列表;

这里有一种方法很有效:

 public static  ArrayList<String> enrichValues(ArrayList<String> values){
    ArrayList<String> array = new ArrayList<String>();

    for (String str : values){ //For each string

        StringBuilder copy = new StringBuilder();

        for (char c : str.toCharArray()) {//For each char

            copy.append(c);

            if(Character.isLetter(c) && Character.isUpperCase(c)){
                copy.append(Character.toLowerCase(c));
            }   
        }            
        array.add(copy.toString());
    }        
    return array;
}
公共静态ArrayList enrichValues(ArrayList值){
ArrayList数组=新的ArrayList();
for(String str:values){//for每个字符串
StringBuilder copy=新建StringBuilder();
for(char c:str.toCharArray()){//for每个字符
副本。附加(c);
if(Character.isleter(c)和Character.isUpperCase(c)){
copy.append(Character.toLowerCase(c));
}   
}            
add(copy.toString());
}        
返回数组;
}
例如:

 public static void main(String[] args) {
    String a = "A123";
    String b = "C123";
    String c = "15B2";
    String d = " Hkjk124";
    String e = "hy71";
    String g = "AbCdE645 DeeeFFD";

    ArrayList<String> values = new ArrayList<String>();
    values.add(a);
    values.add(b);
    values.add(c);
    values.add(d);
    values.add(e);
    values.add(g);

    values = enrichValues(values);
    System.out.println(values.toString());
}
publicstaticvoidmain(字符串[]args){
字符串a=“A123”;
字符串b=“C123”;
字符串c=“15B2”;
字符串d=“Hkjk124”;
字符串e=“hy71”;
字符串g=“AbCdE645 deeffd”;
ArrayList值=新的ArrayList();
增加(a);
增加(b);
增加(c);
增加(d);
增加(e);
增加(g);
值=丰富值(值);
System.out.println(values.toString());
}

输出:[Aa123、Cc123、15Bb2、Hhkjk124、hy71、AabCcdEe645 DDEEFFDD]

< p>当您编写了一个具体的方法来执行<代码>清单>代码>强>接口<>强> >代码> ARALYLIST/COD>,考虑将其改为<代码>列表< /代码>类型。这将允许您通过任何形式的列表:<代码>链接目录> /代码>,<代码> ARARYLIST/<代码>,…< /P> 您应该知道的另一件事是,通过
+=
连接字符串是低效的,因为每次应用
+=
时,它都会创建
新字符串
实例。您不应该这样做,而应该使用
StringBuilder
,它为字符串分配可调整大小的缓冲区,您可以在其中附加其他字符

条件
Character.isUpperCase(c)和&Character.isUpperCase(c)
redudant,因为
Character.isUpperCase(char)
对于非字母字符已经返回
false

如果需要将字符转换为小写,请使用
character.toLowerCase(char)

请注意,字符基本上是整数,因此当您编写如下内容:
char c=65;
并打印该值时,您将在输出中看到“A”,因为65是字符“A”的ASCII值。如果您添加32,您将获得97,即“A”。综合所有内容,您可以编写如下内容:

char c = ...;

// c is in range of upper-case characters
if (c >= 65 && c <= 90) {
    char lower = c + 32;
}

// c is in range of lower-case characters
if (c >= 97 && c <= 122) {
    char upper = c - 32;
}

您可以使用字母表的ASCII值来检查大小写我不明白,为什么您没有应用
Character.isUpperCase(c)
方法?我认为使用String.charAt(I)和Character.toLower()我在下面用一个代码示例回答了这个问题,这个示例对我很有用。它只适用于基本的26个字母的拉丁字母;
Character
具有查找有关char值的各种有趣的功能,包括对所有字母表都有效的大小写测试。I18n,伙计!这是未来的潮流!(;->)没错,但是比较ascii值肯定是更快的方法。^@YuryiKvashuk没问题:)别忘了接受它作为答案,将问题标记为已解决。不幸的是,它不能正常工作。通过使用前一示例{A123,C123,15B2,Hkjk124,hy71,AbCdE645 Deeffd}中的测试值,我得到以下结果[A123,C123,15B2,Hkjk124,hy71,AbCadEc645 Deeeefdfdf],必须为-[Aa123,Cc123,15Bb2,Hhkjk124,hy71,AabCcdEe645 DDEEFFDD]
char c = ...;

// c is in range of upper-case characters
if (c >= 65 && c <= 90) {
    char lower = c + 32;
}

// c is in range of lower-case characters
if (c >= 97 && c <= 122) {
    char upper = c - 32;
}
protected List<String> enrichValues(List<String> list) {
    for (int i = 0; i < list.size(); i++) {
        StringBuilder sb = new StringBuilder(list.get(i));
        for (int j = 0; j < sb.length(); j++) {
            char c = sb.charAt(j);
            if ( Character.isUpperCase(c) ) {
                sb.insert(++j, Character.toLowerCase(c));
            }
        }
        list.set(i, sb.toString());
    }
    return list;
}
protected List<String> enrichValues(List<String> original) {
    List<String> transformed = new ArrayList<>(list.size());
    for (String s : original) {
        StringBuilder sb = new StringBuilder(s);
        for (int j = 0; j < sb.length(); j++) {
            char c = sb.charAt(j);
            if ( Character.isUpperCase(c) ) {
                sb.insert(++j, Character.toLowerCase(c));
            }
        }
        transformed.add(sb.toString());
    }
    return transformed;
}
System.out.println( enrichValues(Arrays.asList("A123", "C123", "15B2")) );
// Output: [Aa123, Cc123, 15Bb2]