如何通过在Java中使用最小数量的if块来简化方程?



我有以下等式,我认为可能有一种方法来简化它:

(A, B, C) = (x, y, z), if (0 <= q < 5)
(y, x, z), if (5 <= q < 10)
(z, x ,y), if (10 <= q < 15)
(z, y, x), if (15 <= q < 20)
(y, z, x), if (20 <= q < 25)
(x, z, y), if (25 <= q < 30)

是否有更好的方法来写这个方程的6个条件?

if(0 <= q && q < 1)
A = x; B 0 y; C = z;
else if(1 <= q && q < 2)
...

可以使用switch语句返回一个带有值的对象。这里我使用record作为不可变类。它也可以是一个普通类。

record Data<T> (T A, T B, T C) {}
Data<Integer> d = getValues(10.6, 10,20,30);
System.out.println(d);
Data<String> d2 = getValues(9.3, "One","Two","Three");
System.out.println(d2);

打印

Data[A=30, B=10, C=20]
Data[A=Two, B=One, C=Three]

  • q转换为int将选择正确的大小写
  • 则返回与q
  • 值相关联的对象如果q超出范围,将抛出异常。
public static <T> Data<T> getValues(double q, T x, T y, T z) {           
return switch((int)(q/5)) {
case 0 -> new Data<>(y,x,z);
case 1 -> new Data<>(y,x,z);
case 2 -> new Data<>(z,x,y);
case 3 -> new Data<>(z,y,x);
case 4 -> new Data<>(y,z,x);
case 5 -> new Data<>(x,z,y);
default -> throw new IllegalArgumentException("Argument out of range q = " + q);

};
}

假设x、y和z值在某种程度上是恒定的,您可以创建一个Map,将q值转换为a、B、c的特定赋值。

Map<Long,Assignment> map = new HashMap<>();
map.put(0, new Assignment(x,y,z));
map.put(1, new Assignment(y,x,z));
...
map.put(5, new Assignment(x,z,y));
public Assignment getAssignment(double q) {
// out of range values of q return null
return map.get((long)Math.floor(q));
}

让我建议一个简单的数据结构:

public class Foo {
private static final List<Foo> library;
static {
library = new ArrayList<Foo>();
library.add(new Foo(x, y, z, 0, 1));
library.add(new Foo(y, x, z, 1, 2));
library.add(new Foo(z, x, y, 2, 3));
library.add(new Foo(z, y, x, 3, 4));
library.add(new Foo(y, z, x, 4, 5));
library.add(new Foo(x, z, y, 5, 6));
};
public static Foo get(double val) {
for(Foo foo : library) {
if(foo.lower <= val && foo.upper > val)
return foo;
}
return null;
}
public final Object A,B,C;
private final double lower,upper;
private Foo(Object A, Object B, Object C, double lower, double upper) {
this.A = A;
this.B = B;
this.C = C;
this.lower = lower;
this.upper = upper;
}
}

然后你可以像这样访问你的值

Foo foo = Foo.get(1.5d);
foo.A; // y

最新更新