我正在努力解决我在作业上遇到的问题。
如何检查某个值是否在某个范围内,例如1≤值≤31,不使用if,switch或任何其他控制结构,在Java?
答案 0 :(得分:9)
// Zero if valid, non-zero otherwise
int n = (int) Math.floor((value - 1) / 31.0);
// Convert any non-zero value to -1 (0xFFFFFFFF) without any boolean logic.
n |= n << 1; n |= n >> 1;
n |= n << 2; n |= n >> 2;
n |= n << 4; n |= n >> 4;
n |= n << 8; n |= n >> 8;
n |= n << 16; n |= n >> 16;
// Value is either -1 or 0. Switch -1 to +1.
n = -n;
// Use array indexing to simulate a conditional.
String[] results = {"valid", "invalid"};
System.out.println(results[n]);
您甚至可以将其扩展为运行不同的代码路径:
Runnable[] options = {
new Runnable() {
public void run() {
System.out.println("valid");
}
},
new Runnable() {
public void run() {
System.out.println("invalid");
}
}
};
options[n].run();
答案 1 :(得分:7)
(value-1)-((value-1+31)%31)
0表示正确,其他任何表示错误。
答案 2 :(得分:4)
您可以将检查设置为布尔值,然后将该布尔值打印出来:
boolean checkValue = (1 <= value && value <= 31);
System.out.println(value);
答案 3 :(得分:4)
您可以使用java断言进行验证,但如果失败,您将获得AssertionError。请参阅http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html。
答案 4 :(得分:3)
嗯,从技术上讲,这不使用控制结构:
boolean isWithinRange = value >= 1 && value <= 31;
但是如果你想使用布尔变量,你需要一个控制结构。
可以通过某种方式使用在不满足某些条件时抛出异常的类(例如,大小为31的缓冲区),然后捕获异常,但在内部这个类也将使用控制结构
所以我的答案是 - 不,你不能 - 你总是需要一个控制结构,即使它隐藏在一些类的实现中。
答案 5 :(得分:2)
一个可能很愚蠢的解决方案:
Arrays.asList("1,2,3,4,5,6,7,8,9,10," +
"11,12,13,14,15,16,17,18,19,20," +
"21,22,23,24,25,26,27,28,29,30,31").split(",").
contains(Integer.toString(value));
答案 6 :(得分:1)
三元运算符是否算作控制结构?它的行为类似于if
语句,但它用作运算符而不是独立语句:
System.out.println((1 <= value && value <= 31) ? "valid" : "invalid");
答案 7 :(得分:1)
您可以做的是使用套接字将值发送到服务器。然后有一个真实的人检查条件,让他/她回复你的答案(真,假)。
您可以使用ObjectInputStream作为布尔对象接收答案,因为布尔对象实现了Serializable,您可以避免使用if。只需将接收到的对象强制转换为布尔变量。