Java If和其他简化

时间:2018-03-13 12:19:19

标签: java

我有这么长的if if else声明,知道我怎么能缩短它?

或者这是我处理这个问题的唯一方法吗?

<NavigationView MenuItemsSource="{Binding Items}">
    <NavigationView.MenuItemTemplate>
        <DataTemplate>
            <NavigationViewItem Icon="{Binding Icon}" Content="{Binding Name}"/>
        </DataTemplate>
    </NavigationView.MenuItemTemplate>
</NavigationView>

5 个答案:

答案 0 :(得分:8)

您可以使用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();

答案 1 :(得分:4)

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

int HR_Score = HR < 41   ? 2 : 
              (HR < 51)  ? 1 : 
              (HR < 101) ? 0 : 
              (HR < 111) ? 1 : 
              (HR < 129) ? 2 :
                           3;

条件运算符(又名“三元”,因为它需要三个操作数)是一种链接if / else语句的便捷方式,你不关心嵌套。

答案 2 :(得分:0)

如果它真的只是那六种可能性,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];
}

..但这比你拥有的更复杂,更难阅读。

或者,给出范围和值的地图:

private static int[][] scoreLookup = {
    {41, 2},
    {51, 1},
    {101, 0},
    {111, 1},
    {129, 2},
    {Integer.MAX_VALUE, 3}
};

然后

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

...但我仍然更喜欢您的if / else

答案 3 :(得分:0)

修改 我建议使用status answer。离开这里是因为它提供了另一种获得相同结果的方法。

您可以使用带键定义的整数的排序地图。

由于你有一个退出早期策略,只有在之前的测试失败时才会出现一个值,我们可以在循环中提前返回。

地图从对,关键字和值中退出。您可以迭代这些键值集,然后将该条目集用作比较函数。

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

现场直播:https://ideone.com/3J3Fqs

import java.util.*;
import java.lang.*;
import java.io.*;


class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Ideone one = new Ideone();
        System.out.println("41:2="+one.getScore(41));
        System.out.println("50:1="+one.getScore(50));
        System.out.println("101:0="+one.getScore(101));
        System.out.println("110:1="+one.getScore(110));
        System.out.println("128:2="+one.getScore(128));
        System.out.println("200:3="+one.getScore(200));
    }
        private SortedMap<Integer, Integer> pairList = null;

       public SortedMap<Integer, Integer> getPairList() {
           if(pairList == null) {
               pairList = new TreeMap<Integer, Integer>();
               pairList.put(42,2);
               pairList.put(51,1);
               pairList.put(101,0);
               pairList.put(111,1);
               pairList.put(129,2);
           }
           return pairList;
       }

    public int getScore(int compare) {
       for(Map.Entry<Integer, Integer> entry : this.getPairList().entrySet()) {
           Integer key = entry.getKey();
           if(compare < key) {
               return entry.getValue();
           }

       }
       return 3;

    }
}

作为一个无关的评论:我建议你远离“魔术数字”/“硬编码”。尝试查看是否可以将它们放在设置文件或数据库中并从那里加载它们。 这将使您的应用程序更加面向未来,更容易更改值,而无需重新编译和重新部署。

答案 4 :(得分:0)

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

//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);