Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java If和else简化_Java - Fatal编程技术网

Java If和else简化

Java If和else简化,java,Java,我有一个很长的if和else语句,你知道如何缩短它吗 还是这将是我处理这件事的唯一方法 if (HR < 41) { HR_Score = 2; } else if (HR < 51) { HR_Score = 1; } else if (HR < 101) { HR_Score = 0; } else if (HR < 111) { HR_Score = 1; } else if (HR < 129) { HR_Score

我有一个很长的if和else语句,你知道如何缩短它吗

还是这将是我处理这件事的唯一方法

if (HR < 41) {
    HR_Score = 2;
} else if (HR < 51) {
    HR_Score = 1;
} else if (HR < 101) {
    HR_Score = 0;
} else if (HR < 111) {
    HR_Score = 1;
} else if (HR < 129) {
    HR_Score = 2;
} else {
    HR_Score = 3;
}
if(HR<41){
HR_得分=2;
}否则如果(HR<51){
HR_得分=1;
}否则如果(HR<101){
HR_得分=0;
}否则如果(HR<111){
HR_得分=1;
}否则如果(HR<129){
HR_得分=2;
}否则{
HR_得分=3分;
}

如果真的只有这六种可能性,那么
If
/
else
就可以了,我不希望任何替代方案更清晰

我会坚持使用
if
/
else

一个不好的替代方案示例:-)

如果
HR
的范围相对较窄,则可以使用查找表

private static final int[] scores = {2, 2, 2, 2, 2, /*...*/ 1, /*...*/ 0, /*...*/};
然后,当您需要分数时:

if (HR >= 0 && HR < scores.length) {
    HR_Score = scores[HR];
}
然后

for (int[] entry : scoreLookup) {
    if (HR < entry[0]) {
        HR_Score = entry[1];
        break;
    }
}
for(int[]条目:scoreLookup){
如果(HR

…但我仍然希望您的
如果
/
否则

您可以使用NavigableMap解决您的问题。例如:

// In the class
private static final NavigableMap<Integer, Integer> map = new TreeMap<>();
map.put(41, 2);
map.put(51, 1);
map.put(101, 0);
map.put(111, 1);
map.put(129, 2);
map.put(Integer.MAX_VALUE, 3);

// When you need a score
HR_Score = map.ceilingEntry(HR).getValue();
//在类中
private static final NavigableMap map=new TreeMap();
地图.put(41,2);
地图.put(51,1);
map.put(101,0);
地图.put(111,1);
普特地图(129,2);
map.put(Integer.MAX_值,3);
//当你需要分数的时候
HR_Score=map.ceilingEntry(HR.getValue();
编辑 我建议用这个。把这个放在这里是因为它提供了一种获得相同结果的替代方法

您可以使用带有由键定义的整数的排序映射

因为您有一个提前退出策略,所以只有在前面的测试失败时,值才能出现,我们可以在循环中提前返回

映射成对存在,一个键和一个值。您可以迭代这些键值集,然后将该条目集用作比较函数

我使用下面的TreeMap作为实现,因为这样我们可以相对确定排序顺序是插入顺序

现场观看:

import java.util.*;
导入java.lang.*;
导入java.io.*;
表意文字
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
Ideone=新Ideone();
System.out.println(“41:2=“+1.getScore(41));
System.out.println(“50:1=“+1.getScore(50));
System.out.println(“101:0=“+1.getScore(101));
System.out.println(“110:1=“+1.getScore(110));
System.out.println(“128:2=“+1.getScore(128));
System.out.println(“200:3=“+1.getScore(200));
}
private SortedMap pairList=null;
公共分类地图getPairList(){
if(pairList==null){
pairList=newtreemap();
pairList.put(42,2);
pairList.put(51,1);
pairList.put(101,0);
pairList.put(111,1);
pairList.put(129,2);
}
返回成对列表;
}
公共整数getScore(整数比较){
for(Map.Entry:this.getPairList().entrySet()){
整数key=entry.getKey();
如果(比较<键){
返回条目.getValue();
}
}
返回3;
}
}
作为一个无关的评论:我建议你远离“魔法数字”/“硬编码数字”。试着看看是否可以将它们放在设置文件或数据库中,然后从那里加载它们。
这将使您的应用程序更经得起未来的考验,更易于更改值,而无需重新编译和重新部署。

您可以使用
?:运算符以缩短代码:

int HR_Score = HR < 41   ? 2 : 
              (HR < 51)  ? 1 : 
              (HR < 101) ? 0 : 
              (HR < 111) ? 1 : 
              (HR < 129) ? 2 :
                           3;
int HR\u分数=HR<41?2 : 
(HR<51)?1 : 
(HR<101)?0 : 
(HR<111)?1 : 
(HR<129)?2 :
3.

条件运算符(也称为“三元”,因为它需要三个操作数)是链接您不想嵌套的if/else语句的一种方便方法

您还可以查看我的解决方案版本

//solution1:
     if (HR < 41)  HR_Score = 2;
else if (HR < 51)  HR_Score = 1;
else if (HR < 101) HR_Score = 0;
else if (HR < 111) HR_Score = 1;
else if (HR < 129) HR_Score = 2;
else               HR_Score = 3;


//solution2:
if (HR < 41)  HR_Score = 2; else 
if (HR < 51)  HR_Score = 1; else 
if (HR < 101) HR_Score = 0; else 
if (HR < 111) HR_Score = 1; else 
if (HR < 129) HR_Score = 2; else 
              HR_Score = 3;


//no branch solution.
HR_Score = 3 - (HR < 129)
             - (HR < 111)
             - (HR < 101)
             + (HR < 51)
             + (HR < 41);
             
//解决方案1:
如果(HR<41)HR_得分=2;
否则,如果(HR<51)HR_得分=1;
如果(HR<101)HR_得分=0,则为其他情况;
如果(HR<111)HR_得分=1,则为其他情况;
否则,如果(HR<129)HR_得分=2;
其他HR_分数=3;
//解决方案2:
如果(HR<41)HR_得分=2;其他的
如果(HR<51)HR_得分=1;其他的
如果(HR<101)HR_得分=0;其他的
如果(HR<111)HR_得分=1;其他的
如果(HR<129)HR_得分=2;其他的
HR_得分=3分;
//没有分支解决方案。
HR_得分=3-(HR<129)
-(HR<111)
-(心率<101)
+(HR<51)
+(HR<41);

HR
an
int
?这就是整个问题,还是它会持续更长的时间,而你为了这个问题缩短了它?是的,人力资源是一个非常重要的问题。我还偷偷问了一个你可能还没看到的问题我想知道对于SO的格式来说,这是否过于基于观点。这很难看,但你正在做的事情非常清楚-任何人都可以在几秒钟内理解它-用一个有意义的名称将其包装在一个方法中,然后继续。我不知道下一个java版本中的新模式匹配是否会以
case(x<41)的形式支持这一点打破2,但如果它能或更好的话那就太好了:
案例(x<41)->2
@Eugene:是的,如果他们能让它足够简洁的话。在JavaScript中,大小写标签可以是表达式,它们可以按顺序进行测试,因此您可以在JavaScript中使用
开关
,但是
开关
非常冗长,通常与
if
/
elseif
/
else
比上述内容更清楚,但这至少是一个可行的替代方案,与其他几个答案不同。我喜欢这个答案。我发现这个答案比标准if/els更令人困惑
int HR_Score = HR < 41   ? 2 : 
              (HR < 51)  ? 1 : 
              (HR < 101) ? 0 : 
              (HR < 111) ? 1 : 
              (HR < 129) ? 2 :
                           3;
//solution1:
     if (HR < 41)  HR_Score = 2;
else if (HR < 51)  HR_Score = 1;
else if (HR < 101) HR_Score = 0;
else if (HR < 111) HR_Score = 1;
else if (HR < 129) HR_Score = 2;
else               HR_Score = 3;


//solution2:
if (HR < 41)  HR_Score = 2; else 
if (HR < 51)  HR_Score = 1; else 
if (HR < 101) HR_Score = 0; else 
if (HR < 111) HR_Score = 1; else 
if (HR < 129) HR_Score = 2; else 
              HR_Score = 3;


//no branch solution.
HR_Score = 3 - (HR < 129)
             - (HR < 111)
             - (HR < 101)
             + (HR < 51)
             + (HR < 41);