我知道这个问题是基本的,但我正在寻找一种不太笨拙的方法来处理以下if语句:
if ((sOne.Contains('*')) || (sOne.Contains('/')) || (sOne.Contains('-')) || (sOne.Contains('+')) || (sOne.Contains('%'))){
我还应该注意sOne.Contains()
引用以下代码......
public boolean Contains(char key) {
// Checks stack for key
boolean retval = arrs.contains(key);
return retval;
}
还应该注意的是,这五个字符永远不会改变。
答案 0 :(得分:6)
你可以在字符数组上使用break-each循环:
for (char c : "*/-+%".toCharArray()) {
if (sOne.Contains(c)) {
// ...
break;
}
}
如果您非常关注性能,可能还需要提取toCharArray()
调用并将结果缓存为static final char[]
常量。
您甚至可以使用此策略在sOne
对象上定义其他便捷方法,例如ContainsAny
或ContainsAll
(信用Sina Madrid获取名称ContainsAny
}):
public boolean ContainsAny (CharSequence keys) {
for (int i = 0; i < keys.length; i++)
if (Contains(keys.charAt(i)) return true;
return false;
}
public boolean ContainsAll (CharSequence keys) {
for (int i = 0; i < keys.length; i++)
if (!Contains(keys.charAt(i)) return false;
return true;
}
用法看起来像这样:
if (sOne.ContainsAny("*/-+%")) {
// ...
}
答案 1 :(得分:4)
您可以尝试使用这样的正则表达式
if (sOne.matches(".*[-*/+%].*")) {
// your code
}
答案 2 :(得分:4)
某处,您需要列表中的字符:
List<Character> keys = Arrays.asList('*', '/', '-', '+', '%');
然后你可以这样做:
if (keys.stream().anyMatch(sOne::Contains)) {
答案 3 :(得分:1)
这个方法怎么样: 项目是存储在数组中的密钥。
public static boolean stringContainsItemFromList(String inputStr, String[] items)
{
for(int i =0; i < items.length; i++)
{
if(inputStr.contains(items[i]))
{
return true;
}
}
return false;
}
答案 4 :(得分:1)
您没有显示 arr 是什么,但由于它有包含方法,我将假设它是一个集合。因此,如果您将密钥放入静态集合(如Set)中,并且 arr 也是某种类型的集合,则可以使用 Collections.disjoint 。如果两个集合之间没有交集,不相交将返回true。
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
public class Test {
static Set<Character> keys = new HashSet<Character>(Arrays.asList('*','/','-','+','%'));
static class SOne {
Set<Character> arrs = null;
SOne(String line) {
arrs = line.chars().mapToObj(e->(char)e).collect(Collectors.toSet());
}
public boolean Contains(Set<Character> checkset) {
return !Collections.disjoint(arrs, checkset);
}
}
static public void main(String args[]) {
SOne sOne = new SOne("Does not contain");
SOne sTwo = new SOne("Does contain a + sign");
if(sOne.Contains(keys)) {
System.out.println("Fail: Contains a key");
} else {
System.out.println("Pass: Does not contain a key");
}
if(sTwo.Contains(keys)) {
System.out.println("Pass: Contains a key");
} else {
System.out.println("Fail: Does not contain a key");
}
}
}
答案 5 :(得分:1)
您可以编写这样的方法并仍然重复使用现有方法(将T替换为sOne的类型):
static <T> boolean ContainsAny(T sOne, char... keys) {
for (char key : keys) {
if (sOne.Contains(key))
return true;
}
return false;
}
然后您可以使用任意数量的字符来调用它来进行评估:
if (ContainsAny(sOne, '%', '_', '-')) {
//code here
}
答案 6 :(得分:0)
如果您只在一个地方使用此表单的if
语句,那么保持相同的结构但只是更整齐地格式化就可以了:
if (sOne.contains('+') ||
sOne.contains('-') ||
sOne.contains('*') ||
sOne.contains('/') ||
sOne.contains('%')) {
...
}
P.S。在您的方法中,没有必要定义boolean
变量只是为了立即返回它;您可以直接返回其他方法的结果:
public boolean contains(char key) {
// Checks stack for key
return arrs.contains(key);
}
请注意命名约定:方法名称(contains
)应以小写字母开头。