我正在开发一个以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');
}
但这是一个非常糟糕的方法。我将不胜感激任何帮助。
答案 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
类型。这样您就可以传递任何形式的列表:LinkedList
,ArrayList
,...
您应该知道的另一件事是,通过+=
加入字符串效率低下,因为每次应用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;