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