Java 以任意顺序比较值

Java 以任意顺序比较值,java,enums,comparison,Java,Enums,Comparison,我认为这是一个常见的问题,但我找不到任何解决办法 有一个枚举,类似于 public enum MyEnum { C, G, A, T, U } 我需要将一个枚举实例与另一个进行比较,如下所示: public boolean complements(MyEnum other) { if(this.compareTo(C) == 0) { if(other.compareTo(G) { return true; } else retu

我认为这是一个常见的问题,但我找不到任何解决办法

有一个枚举,类似于

public enum MyEnum { C, G, A, T, U }
我需要将一个枚举实例与另一个进行比较,如下所示:

public boolean complements(MyEnum other) {
    if(this.compareTo(C) == 0) {
        if(other.compareTo(G) {
            return true;
        } else return false;
    }
    ...
}
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;
    }
    ...
}

提前感谢。

为什么不设置一个
补充项
字段?你可以让它成为一个

enum MyEnum{
G、 C,A,T,U;
静止的{
C.补码=(G)的枚举集;
G.补码=(C)的枚举集;
A.complements=EnumSet.of(T);
T.complements=(A,U)的枚举集;
U.补码=(T)的枚举集;
}
私有枚举集补充;
公共布尔补码(MyEnum其他){
返回补充。包含(其他);
}
}

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

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;
    }
}

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

代码如下:

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);
    }
}
公共枚举MyEnum{
C、 G,A,T,U;
私有静态最终映射补充SMAP;
静止的{
complementsMap=新的枚举映射(MyEnum.class);
//互补配对
(G)的补集;
(C)的补集;
互补映射put(A,枚举集(T));
(A,U)的补集;
(T)的补集;
(U)的补集;
}
公共布尔补码(最终MyEnum other){
返回smap.get(this.contains)(其他);
}
}

枚举项可以包含以下字段:

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。

相比,“complements”应该与
有什么关系?
?当我说C补足G时,这是一个特定于域的话题。在代码中,我只想在调用
C.complements(G)时返回
true
.
U
不应该是枚举值之一吗?好主意,除了
t
补充了
A
U
之外。但是您有两个成员
t
s。@ssedano
asList()
是一个O(1)操作,唯一的开销是实例化一个新对象,这并不多。在任何情况下,是的,这两种变体都是可能的。@ssedano没有看到编辑,我决定使用
EnumSet
。@CommuSoft作为位向量。当与枚举一起使用时,它们比其他集合实现更快。我认为这种模式会引入高耦合,在设计模式中会有一种难闻的气味。。。但是我喜欢彩虹破折号图标:
案例A:
不完整。但是+1,因为它是一个简单而好的解决方案@CommuSoft它看起来像是DNA和RNA的互补,所以在一段时间内不会改变,我猜:PYeah我与DNA建立了联系(RNA使用Uracyl so
U
)。但总的来说,这并不是解决这个问题的好办法。。。但毫无疑问,这是可行的。Case
A
不是不完整的:它将移动到下一个标签。@wingleader-对于一般解决方案,您可能应该使用实现集合论关系的库。一些免费的是和(我没有使用威瑟尔一号,所以不能证明它们的质量。如果两者都不起作用的话,至少来源可以给你一些关于你自己的普通配对类的想法。)那么
A
的补充是
t
U
实际上在化学上几乎等同于
A
。使用字符串解决。。。虽然我同意它没有那么有效,但它是一个低耦合的解决方案…我喜欢你的方向,这样可以纠正你的问题,但下次在发布之前尝试编译你的代码。我不知道
U
最初是它的一部分。。。但我们确实应该更仔细地阅读这些问题。使用字符串而不是基本字符数组确实是一种效率改进。当作为
C
的补充给出时,没有
C
会返回false。因为如果
C
是字符串
“G”
中的一个字符,它会很好地进行搜索,该字符串为false。现在它工作正常了…@gyroless C.complete(C)返回false,我不明白你的意思。