【问题标题】:How can I shorten my if statements [closed]如何缩短我的 if 语句 [关闭]
【发布时间】:2017-09-07 16:17:12
【问题描述】:

大家下午好。 我正在尝试编写一个模仿电脑游戏猴岛秘密中包含的密码轮的小程序。它由两个带有海盗脸的纸板轮组成。将脸的上半部分与另一个下半部分结合起来,在从第二个圆盘切出的窗口中显示了不同的年份日期。你可以在这里看到它:Dial-A-Pirate

到目前为止,这项任务对我来说似乎很简单。我有一个多年来的数组和两个用于图像文件名标识符的数组列表:

private int [][] years = {  {1710,  1651,   1679,   1719,   1694,   1632,   1668,   1703,   1726,   1564,   1615,   1599,   1669,   1660,   1687},
                            {1658,  1702,   1725,   1630,   1709,   1594,   1614,   1563,   1649,   1693,   1577,   1678,   1686,   1597,   1718},
                            {1724,  1667,   1691,   1685,   1613,   1580,   1723,   1717,   1684,   1628,   1643,   1559,   1573,   1708,   1701},
                            {1672,  1562,   1721,   1666,   1673,   1670,   1692,   1656,   1567,   1674,   1662,   1655,   1646,   1671,   1611},
                            {1627,  1707,   1688,   1699,   1568,   1705,   1579,   1585,   1665,   1706,   1506,   1722,   1716,   1584,   1551},
                            {1566,  1592,   1654,   1635,   1639,   1695,   1704,   1711,   1609,   1681,   1712,   1542,   1565,   1720,   1664},
                            {1690,  1682,   1601,   1619,   1680,   1621,   1652,   1689,   1713,   1697,   1696,   1624,   1604,   1653,   1641}};

ArrayList<Integer> disk1 = new ArrayList<Integer>();
ArrayList<Integer> disk2 = new ArrayList<Integer>();


public void createDisks() {
    int i;
    for(i=1; i <=29; i = i +2 ){
        disk1.add(i);
    }
    for(i=2; i <=30; i = i +2 ){
        disk2.add(i);
    }
}

我使用 collections.rotate 将我的列表旋转一并且只查看 [0] [0]。 由于只有 15 个真正不同的轮子组合,我创建了一个 int pirateID 来将标签设置为数组中的相应年份。 这引出了我的问题。我想出的唯一可能的方法是一个巨大的 if 语句:

    private int getPirateID() {

    String temp = Integer.toString(disk1.get(0)) + Integer.toString(disk2.get(0));
    pirateID = Integer.parseInt(temp);

    if (pirateID == 12 || pirateID == 34 || pirateID == 56 || pirateID == 78 || pirateID == 910 || pirateID == 1112 || pirateID == 1314 || pirateID == 1516 || pirateID == 1718 || pirateID == 1920 || pirateID == 2122 || pirateID == 2324 || pirateID == 2526 || pirateID == 2728 || pirateID == 2930) {

        pirateID = 0;
    }

    if (pirateID == 130 || pirateID == 32 || pirateID == 54 || pirateID == 76 || pirateID == 98 || pirateID == 1110 || pirateID == 1312 || pirateID == 1514 || pirateID == 1716 || pirateID == 1918 || pirateID == 2120 || pirateID == 2322 || pirateID == 2524 || pirateID == 2726 || pirateID == 2928) {

        pirateID = 1;
    }

    if (pirateID == 128 || pirateID == 330 || pirateID == 52 || pirateID == 74 || pirateID == 96 || pirateID == 118 || pirateID == 1310 || pirateID == 1512 || pirateID == 1714 || pirateID == 1916 || pirateID == 2118 || pirateID == 2320 || pirateID == 2522 || pirateID == 2724 || pirateID == 2926) {
        pirateID = 2;
    }

    if (pirateID == 126 || pirateID == 328 || pirateID == 530 || pirateID == 72 || pirateID == 94 || pirateID == 116 || pirateID == 138 || pirateID == 1510 || pirateID == 1712 || pirateID == 1914 || pirateID == 2116 || pirateID == 2318 || pirateID == 2520 || pirateID == 2722 || pirateID == 2924) {
        pirateID = 3;
    }

    if (pirateID == 124 || pirateID == 326 || pirateID == 528 || pirateID == 730 || pirateID == 92 || pirateID == 114 || pirateID == 136 || pirateID == 158 || pirateID == 1710 || pirateID == 1912 || pirateID == 2114 || pirateID == 2316 || pirateID == 2518 || pirateID == 2720 || pirateID == 2922) {
        pirateID = 4;
    }

    if (pirateID == 122 || pirateID == 324 || pirateID == 526 || pirateID == 728 || pirateID == 930 || pirateID == 112 || pirateID == 134 || pirateID == 156 || pirateID == 178 || pirateID == 1910 || pirateID == 2112 || pirateID == 2314 || pirateID == 2516 || pirateID == 2718 || pirateID == 2920) {
        pirateID = 5;
    }

    if (pirateID == 120 || pirateID == 322 || pirateID == 524 || pirateID == 726 || pirateID == 928 || pirateID == 1130 || pirateID == 132 || pirateID == 154 || pirateID == 176 || pirateID == 198 || pirateID == 2110 || pirateID == 2312 || pirateID == 2514 || pirateID == 2716 || pirateID == 2918) {
        pirateID = 6;
    }

    if (pirateID == 118 || pirateID == 320 || pirateID == 522 || pirateID == 724 || pirateID == 926 || pirateID == 1128 || pirateID == 1330 || pirateID == 152 || pirateID == 174 || pirateID == 196 || pirateID == 218 || pirateID == 2310 || pirateID == 2512 || pirateID == 2714 || pirateID == 2916) {
        pirateID = 7;
    }

    if (pirateID == 116 || pirateID == 318 || pirateID == 520 || pirateID == 722 || pirateID == 924 || pirateID == 1126 || pirateID == 1328 || pirateID == 1530 || pirateID == 172 || pirateID == 194 || pirateID == 216 || pirateID == 238 || pirateID == 2510 || pirateID == 2712 || pirateID == 2914) {
        pirateID = 8;
    }

    if (pirateID == 114 || pirateID == 316 || pirateID == 518 || pirateID == 720 || pirateID == 922 || pirateID == 1124 || pirateID == 1326 || pirateID == 1528 || pirateID == 1730 || pirateID == 192 || pirateID == 214 || pirateID == 236 || pirateID == 258 || pirateID == 2710 || pirateID == 2912) {
        pirateID = 9;
    }

    if (pirateID == 112 || pirateID == 314 || pirateID == 516 || pirateID == 718 || pirateID == 920 || pirateID == 1122 || pirateID == 1324 || pirateID == 1526 || pirateID == 1728 || pirateID == 1930 || pirateID == 212 || pirateID == 234 || pirateID == 256 || pirateID == 278 || pirateID == 2910) {
        pirateID = 10;
    }

    if (pirateID == 110 || pirateID == 312 || pirateID == 514 || pirateID == 716 || pirateID == 918 || pirateID == 1120 || pirateID == 1322 || pirateID == 1524 || pirateID == 1726 || pirateID == 1928 || pirateID == 2130 || pirateID == 232 || pirateID == 254 || pirateID == 276 || pirateID == 298) {
        pirateID = 11;
    }
    if (pirateID == 18 || pirateID == 310 || pirateID == 512 || pirateID == 714 || pirateID == 916 || pirateID == 1118 || pirateID == 1320 || pirateID == 1522 || pirateID == 1724 || pirateID == 1926 || pirateID == 2128 || pirateID == 2330 || pirateID == 252 || pirateID == 274 || pirateID == 296) {
        pirateID = 12;
    }
    if (pirateID == 16 || pirateID == 38 || pirateID == 510 || pirateID == 712 || pirateID == 914 || pirateID == 1116 || pirateID == 1318 || pirateID == 1520 || pirateID == 1722 || pirateID == 1924 || pirateID == 2126 || pirateID == 2328 || pirateID == 2530 || pirateID == 272 || pirateID == 294) {
        pirateID = 13;
    }
    if (pirateID == 14 || pirateID == 36 || pirateID == 58 || pirateID == 710 || pirateID == 912 || pirateID == 1114 || pirateID == 1316 || pirateID == 1518 || pirateID == 1720 || pirateID == 1922 || pirateID == 2124 || pirateID == 2326 || pirateID == 2528 || pirateID == 2730 || pirateID == 292) {
        pirateID = 14;
    }


    return pirateID;
}

但这真的不可能吗?必须有更短的方法来做到这一点,对吧?

【问题讨论】:

  • 我还是新手,但谁能告诉我这篇文章是否更适合代码审查?
  • Codereview SE 更适合回答这个问题。
  • 我投票结束这个问题,因为它更适合 Code Review SE!
  • 使用switch 声明。或者创建一个Map&lt;Integer, Integer&gt; 并进行地图查找。
  • 只要有年份矩阵并保持一个指向当前偏移量的int。你不需要其他东西。

标签: java arrays if-statement arraylist


【解决方案1】:

您可以使用switch 声明:

switch(pirateID) {
      case 12:
      case 34:
      case 56:
          pirateID = 1;
          break;
      case 130:
      case 32:
      case 54:
          pirateID = 0;
          break;
}

...等等。

在这种情况下,对输入和输出使用相同的变量是一个坏习惯——改变值会让人感到困惑。为什么不:

final int userInput = Integer.parseInt(temp);
final int pirateId;
switch(userInput) {
    case 12:
         pirateId = 1;
    ...
    default:
         pirateId = 10;
}

另一种选择是填写Map

Map<Integer,Integer> idMap = new HashMap<>();
idMap.put(12,1);
idMap.put(130,0);
... etc.

pirateId = idMap.get(userInput);

【讨论】:

    【解决方案2】:

    您可以为每个if 条件创建一个ArrayList,并为每个条件使用al.contains(pirateID)。仍然有很多 ifs,但整体代码更短。

    类似:

    int [] array1 = {12, 34, 56, 78, 910, 1112, 1314, 1516, 1718, 1920, 2122, 2324, 2526, 2728, 2930};
    int [] array2 = {130, 32, 54, 76, 98, 1110, 1312, 1514, 1716, 1918, 2120, 2322, 2524, 2926, 2928};
    
    if (Arrays.asList(array2).contains(pirateID)) {
        pirateID = 0;
    } else if (Arrays.asList(array2).contains(pirateID)) {
    
        pirateID = 1;
    }
    // etc...
    

    编辑:根据@slim 的建议,添加一个 else if 将它们链接在一起。

    【讨论】:

    • 就性能而言,这是一个糟糕的解决方案。
    • @Lothar 如果您添加了else,则在性能方面与问题中的版本相当。
    • @slim 是的,但这仍然很可怕;-) 您在答案中描述的解决方案要好得多,因为它是 O(1)(地图变体除外)而不是 O(n)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2012-04-06
    • 2012-07-05
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多