Java If/Else替代方案

Java If/Else替代方案,java,if-statement,Java,If Statement,我的程序中有上述代码,我想知道是否有更好的方法来实现此方法,而不必使用大量的if/else语句。字符数组中的字符对 您可以将符号对(打开和关闭)提取到char[][]中,然后在该数组中循环测试匹配项。大概 public boolean typeMatch(char c1, char c2) { if (c1 == '{' || c1 == '}') { return (c2 == '{' || c2 == '}'); } else if (c1 == '(' |

我的程序中有上述代码,我想知道是否有更好的方法来实现此方法,而不必使用大量的if/else语句。

字符数组中的字符对 您可以将符号对(打开和关闭)提取到
char[][]
中,然后在该数组中循环测试匹配项。大概

public boolean typeMatch(char c1, char c2) {

    if (c1 == '{' || c1 == '}') {
        return (c2 == '{' || c2 == '}');
    } else if (c1 == '(' || c1 == ')') {
        return (c2 == '(' || c2 == ')');
    } else if (c1 == '[' || c1 == ']') {
        return (c2 == '[' || c2 == ']');
    } else {
        return false;
    }
}
static final char[][] pairs = { { '{', '}' }, { '(', ')' }, { '[', ']' } };

public boolean typeMatch(char c1, char c2) {
    for (char[] pair : pairs) {
        if (c1 == pair[0] || c1 == pair[1]) {
            return c2 == pair[0] || c2 == pair[1];
        }
    }
    return false;
}
字符串数组中的字符对 或者,如果我们使用
字符串和2实现1,阅读1可能会更容易。大概

public boolean typeMatch(char c1, char c2) {

    if (c1 == '{' || c1 == '}') {
        return (c2 == '{' || c2 == '}');
    } else if (c1 == '(' || c1 == ')') {
        return (c2 == '(' || c2 == ')');
    } else if (c1 == '[' || c1 == ']') {
        return (c2 == '[' || c2 == ']');
    } else {
        return false;
    }
}
static final char[][] pairs = { { '{', '}' }, { '(', ')' }, { '[', ']' } };

public boolean typeMatch(char c1, char c2) {
    for (char[] pair : pairs) {
        if (c1 == pair[0] || c1 == pair[1]) {
            return c2 == pair[0] || c2 == pair[1];
        }
    }
    return false;
}
1这从来都不是坏事。
2链接的Javadoc在某种程度上说,在这两种情况下,如果这个字符串中没有出现这样的字符,则返回
-1

将比我的要好得多,但我想我会有一些乐趣

public boolean typeMatch(char c1, char c2) {
    String[] pairs = { "{}", "()", "[]" };
    for (String pair : pairs) {
        if (pair.indexOf(c1) != -1) {
            return pair.indexOf(c2) != -1;
        }
    }
    return false;
}
私有静态最终映射pairMap;
公共布尔类型匹配(字符c1、字符c2){
集合s=pairMap.get(c1);
返回s!=null&&s.contains(c2);
}
静止的{
pairMap=newhashmap();
寄存器(makeSet('{','}');
寄存器(makeSet(“(”,“)”);
寄存器(makeSet('[',']');
}
私有静态集makeSet(char…chars){
Set s=新哈希集(字符长度,1.0f);
for(char c:chars){
s、 添加(c);
}
返回s;
}
专用静态无效寄存器(集合s){
用于(字符c:s){
pairMap.put(c,s);
}
}

此解决方案的内存需求很高。它唯一需要推荐的是,如果您需要处理大量的字符等价类而不是三对,那么它将在执行时间方面更好地扩展。此外,它还可以被推广到处理除char(或者准确地说,
Character
)之外的其他类型。

不是最可读的,但我尝试使用位运算符来实现这一点时很开心,我想我会发布它

private static final Map<Character, Set<Character>> pairMap;

public boolean typeMatch(char c1, char c2) {
    Set<Character> s = pairMap.get(c1);
    return s != null && s.contains(c2);
}

static {
    pairMap = new HashMap<>();
    register(makeSet('{', '}'));
    register(makeSet('(', ')'));
    register(makeSet('[', ']'));
}

private static Set<Character> makeSet(char... chars) {
    Set<Character> s = new HashSet<>(chars.length, 1.0f);
    for (char c : chars) {
        s.add(c);
    }
    return s;
}

private static void register(Set<Character> s) {
    for (Character c : s) {
        pairMap.put(c, s);
    }
}
它至少应该相当快

public boolean typeMatch(char c1, char c2) {
    int xor = c1 ^ c2;
    if(xor == 6) { // 2 apart
        return c1 == '{' || c1 == '}' || c1 == '[' || c1 == ']';
    } else if(xor == 1) { // 1 apart
        return c1 == '(' || c1 == ')';
    } else if(xor == 0) { // same
        return c1 == '(' || c1 == ')' || 
                c1 == '{' || c1 == '}' || c1 == '[' || c1 == ']';
    }
    return false;
}

有一点棘手,也许…

这里已经有了一个公认的答案,这是一个很好的答案,但它对于手头的问题非常具体

对于那些通过搜索更通用的解决方案来到这里的人,我想提供我最喜欢的模式来消除if/else链:

private static final String PAIRS = "{}()[]";
public boolean typeMatch(char c1, char c2) {
    int indexOfC1 = PAIRS.indexOf(c1);
    int indexOfC2 = PAIRS.indexOf(c2);
    return indexOfC1 >= 0 && indexOfC2 >= 0 && (indexOfC1 / 2 == indexOfC2 / 2);   
}

当然,这可以推广到任何返回类型。

@Tom my bad,没有看到变量的差异。你还必须测试indexOfC2>=0,因为-1/2是0。或者甚至是
(PAIRS.indexOf(c1)^PAIRS.indexOf(c2)和-2)==0
,对于一行程序。哦,除了我的建议与Christian指出的错误相同,不考虑-1的情况下。@Christiand'Heureuse已修复。我总是忘记这些愚蠢的C风格的
/
%
的定义没有它们应该具备的好的数学特性。是的,好吧,所以我的一行代码被严重破坏了。是的,
&
优先于
^
,这意味着我看起来很傻。这里有一个教训。当一个人试图变得太聪明时,他肯定会出错。这就是为什么Elliott的解决方案如此好——它并不聪明。它非常清晰,易于维护,并且工作正常。