我有这段代码
if(beforeModify.get(i).equals("a")|beforeModify.get(i).equals("e")|beforeModify.get(i).equals("i")|
beforeModify.get(i).equals("o")|beforeModify.get(i).equals("u")|beforeModify.get(i).equals("á")|
beforeModify.get(i).equals("é")|beforeModify.get(i).equals("í")|beforeModify.get(i).equals("ě")|
beforeModify.get(i).equals("y")|beforeModify.get(i).equals("ý")|beforeModify.get(i).equals("ů")|
beforeModify.get(i).equals("ú"))
我可以做得更好吗?
答案 0 :(得分:11)
您可以将其写为List.contains
来电:
if (Arrays.asList("a", "e", etc).contains(beforeModify.get(i))
但您也可以预先构建Set
,然后使用:
// Build once, keep the set to reuse.
Set<String> set = new HashSet<>(Arrays.asList("a", "e", etc));
if (set.contains(beforeModify.get(i))
HashSet
的优势在于元素数量为O(1)
; List
为O(n)
。
另外:您使用的是|
,而不是||
。前者将评估所有操作数,后者将在其中一个匹配时立即停止。您不需要对它们进行全面评估,因为文字参数上的String.equals
没有副作用。使用||
。
答案 1 :(得分:1)
我喜欢Andy Turner的解决方案,这里也使用String而不是List of Set的其他解决方案:
解决方案1
String str = "aeiouáéíěyýůú";//put the characters you want to check in a string
String s = "z";
//you can use String.contains
if (s.length() == 1 && str.contains(s)) {
//...
}
解决方案2
//you can also use replaceAll non that char to check if it is correct or not
if (s.length() == 1 && !str.replaceAll("[^" + s + "]", "").isEmpty()) {
//...
}
解决方案3
// You can either use matches
if (str.matches(".*" + s + ".*")) {
//...
}
答案 2 :(得分:1)
我说这是开关的经典案例:
switch(beforeModify.get(i)) {
case "a":
case "e":
// etc...
}
它看起来更具可读性,其执行速度与if
一样快答案 3 :(得分:0)
您可以对正则表达式使用match()方法
String input = beforeModify.get(i);
if(input.matches("a*e*i*o*u*á*é*í*ě*y*ý*ů*ú*") && input.length()==1)
or you could just use
if(input.matches("[aeiouáéíěyýůú]"))
答案 4 :(得分:0)
您也可以使用java 8流来完成。
beforeModify.stream()
.filter(x -> x.matches("[aeiouáéíěyýůú]"))
.forEach(x -> {
/* Your code here */
});
答案 5 :(得分:0)
您可以尝试使用String.matches(String regex)
方法使用正则表达式来解决它。
String str = beforeModify.get(i);
if (str.matches("[aeiouáéíěyýůú]") {
// do whatever you wanna do
}
也不必反复调用beforeModify.get(i)
,因为它可能产生相同的结果。