更好的替代if语句的长列表

时间:2015-11-30 23:56:21

标签: java arrays if-statement

我有一个名为dayCounter的int,运行1到7.我有一个名为day的字符串。 dayCounter使用TimerTask每10秒递增private void run()

我在用于TimerTask ::

if (dayCounter == 1) { day = "Monday"; } 方法中使用以下if语句
package com.example.dom.pointfbugrepro;

import android.graphics.PointF;
import org.junit.Test;
import static org.junit.Assert.*;

public class ExampleUnitTest {
    @Test
    public void pointf_isCorrect() throws Exception {
        PointF foo = new PointF(5, 0);
        assertEquals(5, foo.x, 0.0001f);
    }
}

我每周的每一天都有这样的if语句。是否有更有效的方法可以获得相同的结果。我想也许创建一个包含String月的数组,然后以某种方式递增它。但我不知道如何去做。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

除了if语句之外,您可以使用带计数器的开关案例

switch(dayCounter){
    case 1:
        day = "Monday";
        break;
    case 2: 
        day = "Tuesday";
        break;
}

虽然这是另一种方法,但它们都创建了相同的字节代码,这两个选项之间的唯一区别是代码的可读性。

答案 1 :(得分:3)

最简单的方法可能是使用数组:

public class Demo {

     public static void main(String[] args) {
        System.out.println(getDay(1));
        System.out.println(getDay(7));
     }

     // Returns the corresponding day for the given dayCounter.
     // Assumes that dayCounter goes from 1-7.
     private static String getDay(int dayCounter) {
         String[] days = new String[] { "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday", "Sunday" };
         return days[dayCounter - 1];
     }
}

如果您的计数器超过7(例如,您在每个计时器步骤中将其递增1),您可能希望对此版本感兴趣,该版本基本上遍历所有可用日期:

public class Demo {

     public static void main(String[] args) {
        System.out.println(getDay(1));
        System.out.println(getDay(7));
        System.out.println(getDay(8));
        System.out.println(getDay(13));
     }

     // Returns the corresponding day for the given dayCounter.
     // Maps dayCounter to the range of 1-7, assumes that dayCounter
     // goes from 1-Integer.MAX_VALUE.
     private static String getDay(int dayCounter) {
         String[] days = new String[] { "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday", "Sunday" };
         return days[dayCounter % 7];
     }
}

或者您可以使用DateFormatSymbols来检索工作日,并为您自动翻译(几乎):

import java.text.DateFormatSymbols;

public class Demo {

     public static void main(String[] args) {
        System.out.println(getDay(1));
        System.out.println(getDay(7));
     }

     // Returns the corresponding day for the given dayCounter.
     // Assumes that dayCounter goes from 1-7.
     private static String getDay(int dayCounter) {
        String[] days = DateFormatSymbols.getInstance().getWeekdays();
        return days[dayCounter];
     }
}

或者对于Java 8及更高版本,目前首选的方法可能是使用新的java.time API(您可以使用方法参数)。此API包含一个方便的DayOfWeek枚举。

import java.time.DayOfWeek;
import java.time.format.TextStyle;
import java.util.Locale;

public class Demo {

    public static void main(String[] args) {
        System.out.println(getDay(1));
        System.out.println(getDay(7));
    }

    // Returns the corresponding day for the given dayCounter.
    // Assumes that dayCounter goes from 1-7.
    private static String getDay(int dayCounter) {
        return DayOfWeek.of(dayCounter)
                 .getDisplayName(TextStyle.FULL, Locale.getDefault());
    }

}

如果您只想替换if语句,请按照Ryan的回答中提到的switch-case进行操作。

答案 2 :(得分:1)

你可以拥有一系列字符串,dayOfWeek,一周中的每一天。然后使用dayCounter作为数组的索引。例如,如果dayCounter = 1,则dayOfWeek [dayCounter]将为“Monday”。这样,您只需要一个语句来获取星期几的名称。