我有这个代码过滤字符串str
,只保留一些chars
,导致字符串fStr
减少。细微之处在于我只保留目标char
,如果它不等于char
中的最后一个fStr
:
ArrayList<Character> targetChars = //{a, b, c};
String str = "axxbxxxxbxbxcxa", fStr = "";
for(int i = 0, s = 0 ; i < str.length() ; i++) {
char c = str.charAt(i);
if(targetChars.contains(c)) {
if(s > 0 && fStr.charAt(s-1) != c) {
fStr += c;
s++;
}
}
}
fStr→“abca”
在最里面的if
语句中,我必须在s > 0
之前加入fStr.charAt(s-1) != c
,否则后者会在第一次OutOfBounds
时引发targetChars.contains(c)
例外true
。但只是第一次,它让我很恼火,循环将始终检查我不会出界,因为它只需要做一次。我知道我可以做那样的事情:
ArrayList<Character> targetChars = //{a, b, c};
String str = "auebskrubnbocpa", fStr = "";
int i = 0, s = 0;
for(; i < str.length() ; i++) {
char c = str.charAt(i);
if(targetChars.contains(c)) {
fStr += c;
s++;
i++;
break;
}
}
for(; i < str.length() ; i++) {
char c = str.charAt(i);
if(targetChars.contains(c)) {
if(fStr.charAt(s-1) != c) {
fStr += c;
s++;
}
}
}
但是,是否有一种更优雅,更不烦人的动态截断条件语句的方法?
答案 0 :(得分:2)
有没有办法动态更改Java中if语句的条件?
不,没有。从可读性的角度来看,您的代码的原始版本是最好的。
但是,如果您担心效率,那么您应该使用StringBuilder
而不是fStr += c
。
此外,char[]
和明确的for
循环可能比ArrayList<Character>.contains
更快。
答案 1 :(得分:1)
以下是我将如何做,但不确定它是否适合您的需求
public class Example {
public static void main(String[] args) {
char[] targetChars = {'a', 'b', 'c'};
String str = "axxbxxxxbxbxcxa", fStr = " ";
for(int i = 0 ; i < str.length() ; i++) {
char c = str.charAt(i);
if(isAcceptableChar(c, targetChars)) {
if(fStr.charAt(fStr.length() - 1) != c) {
fStr = fStr.trim() + c;
}
}
}
System.out.println(fStr);
}
private static boolean isAcceptableChar(char newChar, char[] targetChars) {
boolean value = false;
for(char ch : targetChars){
if(ch == newChar) {
value = true;
break;
}
}
return value;
}
}
答案 2 :(得分:0)
当然有,只需调用一个返回你在if条件中使用的布尔值的函数。可以使用函数指针在不同时间调用不同的函数。