如何将新值添加到现有的upperCase到new lowerCase

时间:2017-09-14 08:56:21

标签: java arrays string

我正在开发一个以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(Character.isLetter(c) && Character.isUpperCase(c)) {
   listChars.add(j + 1, 'a');
}

因此我必须添加大量支票:

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

但这是一个非常糟糕的方法。我将不胜感激任何帮助。

4 个答案:

答案 0 :(得分:1)

这是一种像魅力一样的方式:

 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;
}

示例:

 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());
}

输出:[Aa123,Cc123,15Bb2,Hhkjk124,hy71,AabCcdEe645 DdeeeFfFfDd]

答案 1 :(得分:1)

当您编写一些接受List 接口的具体实现的方法(例如ArrayList)时,请考虑将其更改为List类型。这样您就可以传递任何形式的列表:LinkedListArrayList,...

您应该知道的另一件事是,通过+=加入字符串效率低下,因为每次应用new String时都会创建+=个实例。您应该使用StringBuilder而不是这样做,它为字符串分配可调整大小的缓冲区,您可以在其中追加其他字符。

条件Character.isLetter(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;
}

尝试以下方法改变原始列表:

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]

答案 2 :(得分:0)

要确定字母是否为大写,您只需要使用ASCII字母。大写字符从65到90.

所以你只需要在字符串的长度上使用一个循环,并检查每个char是否它的ASCII值介于65和90之间。所以它看起来像这样,假设变量temp是一个字符的string:

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)+22可能无法正常工作,但看起来非常相似。

答案 3 :(得分:0)

使用正则表达式有一种更简单的方法:

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;