如何缩短我的if语句

时间:2017-09-07 16:17:13

标签: java arrays if-statement arraylist

下午好,伙计们。 我正在尝试编写一个小程序,它模仿计算机游戏“猴岛的秘密”中包含的码盘。它由两个带有海盗面的纸板轮组成。将上半部分与另一半下半部分组合显示从第二个磁盘切出的窗口中的不同年份日期。你可以在这里看到它: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;
}

但那真的不可能吗?这样做的方法要短得多,对吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以为每个if条件设置ArrayList,并为每个al.contains(pirateID)使用if。这仍然是很多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... ,但整体代码更短。

类似的东西:

public static function setUpBeforeClass()
{
    $this->getContainer();
    echo "it's called once a class";
}

protected function setUp()
{
    $this->getContainer();
    echo "it's called before each test";
}

编辑:正如@slim所建议的那样,添加了一个if将它们链接在一起。