3

我虽然这是一个常见的问题,但我找不到任何解决方案。

有一个枚举,类似于

public enum MyEnum { C, G, A, T, U }

我需要将一个枚举实例与另一个进行比较,如下所示:

C 补充 G
G 补充 C
A 补充 T
T 补充 A
U 补充 T
T 补充 U

我怎么能不写这样的代码来做到这一点:

public boolean complements(MyEnum other) {
    if(this.compareTo(C) == 0) {
        if(other.compareTo(G) {
            return true;
        } else return false;
    }
    ...
}

提前致谢。

4

4 回答 4

8

为什么没有complements字段?你可以让它成为一个EnumSet.

enum MyEnum {
    G, C, A, T, U;

    static {
        C.complements = EnumSet.of(G);
        G.complements = EnumSet.of(C);
        A.complements = EnumSet.of(T);
        T.complements = EnumSet.of(A, U);
        U.complements = EnumSet.of(T);
    }

    private EnumSet<MyEnum> complements;

    public boolean complements(MyEnum other) {
        return complements.contains(other);
    }
}
于 2013-09-17T18:22:19.230 回答
4

我想说在这种情况下最简单的解决方案是:

public boolean complements(MyEnum other) {
    switch (this) {
        case C:
            return other == G;
        case G:
            return other == C;
        case A:
        case U:
            return other == T;
        case T:
            return other == A || other == U;
        default:
            return false;
    }
}
于 2013-09-17T18:26:25.127 回答
3

您可以使用静态数据结构(例如地图)来存储配对。然后,您可以从您的补充()方法中查找 Map 中的值。

这是代码:

public enum MyEnum {
    C, G, A, T, U;

    private static final Map<MyEnum, EnumSet<MyEnum>> complementsMap;

    static {
        complementsMap = new EnumMap<MyEnum, EnumSet<MyEnum>>(MyEnum.class);
        // complements pairings
        complementsMap.put(C, EnumSet.of(G));
        complementsMap.put(G, EnumSet.of(C));
        complementsMap.put(A, EnumSet.of(T));
        complementsMap.put(T, EnumSet.of(A, U));
        complementsMap.put(U, EnumSet.of(T));
        complementsMap.put(T, EnumSet.of(U));
    }

    public boolean complements(final MyEnum other) {
        return complementsMap.get(this).contains(other);
    }
}
于 2013-09-17T18:26:47.597 回答
0

枚举项可以包含字段:

public enum MyEnum {
    C("G"),
    G("C"),
    A("T"),
    T("AU"),
    U("T");

    private String complement;

    private MyEnum (String complement) {
         this.complement = complement;
    }

    public boolean complement(MyEnum blah) {
        return complement.contains(blah.name());
    }
}

您可以像MyEnum.G.isComplement(MyEnum.C)返回 true 一样使用它。

于 2013-09-17T18:26:52.270 回答