Chr*_*311 7 java binary combinatorics
考虑Web表面上的4个输入字段A,B,C和D. 用户可以任意填写任何这些.如何填充这些字段有16种组合.允许的是:
A B C D
-------
1 0 0 0
1 1 0 0
1 1 1 0
1 1 1 1
Run Code Online (Sandbox Code Playgroud)
其中1表示not null0表示null.
我正在使用jsf的MVC模式.我不希望逻辑在视图中,而是在控制器中.在Java中检查这个的最佳方法是什么?
到目前为止,我实施了两个解
@Override
public boolean isInputInvalid(Integer a, Integer b, Integer c, Integer d) {
if (isNotSet(a) && isNotSet(b) && isNotSet(c) && isNotSet(d) {
return true;
}
return (firstParameterDoesNotExistAndSecondDoesExist(a, b)) || (firstParameterDoesNotExistAndSecondDoesExist(b, c)) || (firstParameterDoesNotExistAndSecondDoesExist(c, d));
}
private boolean firstParameterDoesNotExistAndSecondDoesExist(Integer firstParameter, Integer secondParameter) {
return isNotSet(firstParameter) && !isNotSet(secondParameter);
}
private boolean isNotSet(Integer parameter) {
return parameter == null;
}
Run Code Online (Sandbox Code Playgroud)
public boolean isInputValid(Integer a, Integer b, Integer c, Integer d) {
if (exists(a) && !exists(b) && !exists(c) && !exists(d) || //
exists(a) && exists(b) && !exists(c) && !exists(d) || //
exists(a) && exists(b) && exists(c) && !exists(d) || //
exists(a) && exists(b) && exists(c) && exists(d)) {
return true;
}
return false;
}
private boolean exists(Integer level) {
return level != null;
}
Run Code Online (Sandbox Code Playgroud)
第一种方法检查输入是否无效,而第二种方法检查输入是否 有效(注意方法的名称).
我写了16个单元测试用例,两个版本都运行绿色.
您对如何使代码更具可读性有任何提示/提示/技巧吗?
有效组合为:1000、1100、1110 和 1111
如果您只关心可读性:
public static List<String> validOptions = Arrays.asList("1000","1100","1110","1111");
public boolean isValid(Integer a, Integer b, Integer c, Integer d)
{
StringBuilder sb = new StringBuilder();
sb.append(a==null ? 0 : 1);
sb.append(b==null ? 0 : 1),
sb.append(c==null ? 0 : 1);
sb.append(d==null ? 0 : 1);
return validOptions.contains(sb.toString());
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是最快或最干净的解决方案(浪费一些 CPU 和内存)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |