【问题标题】:How to use an if function to call elements of an array如何使用 if 函数调用数组的元素
【发布时间】:2015-10-06 16:13:25
【问题描述】:

基本上,我有一个变量'prime'。它只能取 0 到 6 之间的值。根据它的值,如果素数为 0,我希望字符串“结果”为星期日,如果为 1,则为星期一,等等。目前,它的编码方式如下:

String result = new String();

    if (prime == 0)
    {
        result = "Sunday";
    }

    if (prime == 1)
    {
        result = "Monday";
    }

    if (prime == 2)
    {
        result = "Tuesday";
    }

    if (prime == 3)
    {
        result = "Wednesday";
    }

    if (prime == 4)
    {
        result = "Thursday";
    }

    if (prime == 5)
    {
        result = "Friday";
    }

    if (prime == 6)
    {
        result = "Saturday";
    }

    else
    {
        result = "Check your code.";
    }

我想知道是否有更快的方法来做到这一点?我创建了一个包含星期几的数组:

String[] days = new String[7];

    days [0] = "Sunday";
    days [1] = "Monday";
    days [2] = "Tuesday";
    days [3] = "Wednesday";
    days [4] = "Thursday";
    days [5] = "Friday";
    days [6] = "Saturday";

我如何快速优雅地对其进行编码,以便如果 prime 的值为 0,则字符串“result”是数组的第一个元素,依此类推,直到如果 prime 为 6,则字符串“result”是第七元素?

【问题讨论】:

  • if (prime >= 0 && prime < days.length) { result = days[prime]; } ...?
  • 不要使用 if 使用 if elseswitch case
  • @MadProgrammer 你真的应该把它作为一个答案,可能会解释你如何使用数组来查找值。毕竟你确实先得到它
  • @TheveshTheva 如果if 块的内容只有一行,则不需要大括号
  • 你已经死心塌地在你的数列上好几天了吗? DayOfWeek.values() 已经进行了查找,但分别是从星期一到星期日(0 - 6)。

标签: java arrays if-statement


【解决方案1】:

您已经将所有有效值存储在一个简单的查找表中,您只需确保请求的值在可用值范围内。

基本的答案是做类似...

if (prime >= 0 && prime < days.length) { 
    result = days[prime]; 
} else {
    result = prime + " is not within a valid range";
    // Or throw an exception
}

这样做是为了确保prime 值在可接受值的有效范围内 (0..days.length - 1),否则它会返回错误消息(或者您可能会引发异常)。

请记住,数组是0 索引的,因此需要使用&lt; days.length(小于)而不是&lt;= days.length(小于或等于)

【讨论】:

  • 使用 DayOfWeek 类也可以解决这个问题,不需要维护一个包含一周中所有天数的数组
  • @gastonmancini 你不是已经有这个讨论了吗?这也假设 OP 使用的是 Java 8。但我已经超越了 OP“存储天数”的想法,而是提供了一种从数组中获取值的解决方案
  • 您是对的,该解决方案假定使用的是 Java 8。
  • 如果您使用的是 Java 8 及更高版本...对于该类,您可以避免使用条件语句并使用带有星期几的对象。
  • 很高兴它可以提供帮助。还有一些其他的好主意,你可以考虑看看;)
【解决方案2】:

你很亲密。对于那些说 Switch 或 if 链的人来说,这对于这个问题来说太过分了。

result = days[Math.abs(prime % days.length)];

数组就像一个 switch 语句,包裹在 Math.abs(绝对值)中的模运算符就像一个安全网,可以保持在数组 0-6 的有效范围内。

感谢@MadProgrammer 的Math.abs

来自Tutorials Point

模数 - 左手操作数除以右手操作数并返回余数

【讨论】:

  • 虽然我很欣赏 % 将滚动索引保持在有效范围内,但为了简单起见,我很想使用简单的范围检查 if 语句 - 但这只是- 这种方法没有问题,但它可能会引发更多问题,然后解决
  • @jay harris 确实如此。但只要不使用像 op 的第一次尝试那样的数组,使用 if 就不好,因为只有一个 if 命令应该被执行。指向它也不错
  • @MadProgrammer 我说这是更简单的方法,而您的方法更具可扩展性。大声笑滚动指数,滚动天数对吗?
  • @FastSnail 你的英语有点烂。?
  • 负值会导致失败 ;)
【解决方案3】:

为什么不使用DayOfWeek 类?

import java.time.DayOfWeek;

试试这个……

try {
     DayOfWeek dayOfWeek = DayOfWeek.of(++prime);
     System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.getDefault()));
} catch (java.time.DateTimeException ex) {
     System.out.println("Invalid value for DayOfWeek");
}

请注意,我们必须使用++prime,因为您的代码从零开始,而枚举从一开始。

如果您必须将 Sunday 设置为第一天(而不是枚举中的第一天 Monday)...minus 方法将执行技巧:

DayOfWeek dayOfWeek = DayOfWeek.of(++prime).minus(1);

编辑:解决方案的优缺点

优点

  • 不需要物品来维持您的生活。

  • 不要使用条件语句。

  • 可以轻松更改文本样式和语言。

缺点

  • 需要java 1.8

【讨论】:

  • 我已经将此作为评论提出。 DayOfWeek.values() 分别是 Mon - Sun (0 - 6),DayOfWeek.of() 分别是 Mon - Sun (1 - 7)。就目前而言,OP 说他们分别想要 Sun - Sat (0 - 6)。
  • 那个用minus或者同一个类的plus方法解决
  • 星期几从Sunday开始的语言环境呢?
  • 在这个getDisplayName方法中,locals只用于格式化,所以不会影响它。
【解决方案4】:

你可以这样做:

if (prime >= 0 && prime < days.length) result = days[prime];
else result = "Check your code."

因为prime 本质上是您想要的当天的索引。

【讨论】:

    【解决方案5】:

    您可以使用 Enum 并定义自己

    public enum Week {
        SUNDAY(1, "Sunday"), Monday(2, "Monday"), TUESDAY(3, "Tuesday"), WEDNESDAY(
                4, "Wednesday"), THURSDAY(6, "Thursday"), FRIDAY(6, "Friday"), SATURDAY(
                7, "Saturday");
        private int id;
        private String name;
    
        static Map<Integer, String> map = new HashMap<Integer, String>();
        static {
            for (Week w : Week.values()) {
                map.put(w.getId(), w.name);
            }
        }
    
        private Week(int id, String name) {
            this.setId(id);
            this.setName(name);
        }
    
        public static String getNameById(int id) {
            return map.get(id);
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getId() {
            return id;
        }
    }
    

    【讨论】:

    • 或者只是设置它让Week.values()[0]返回Sunday
    • 非常感谢@creazymole!在这种情况下,MadProgrammer 的建议最适合我,但你的回答教会了我一些新东西!
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 2020-04-26
    • 2012-11-28
    • 2023-03-07
    • 2015-11-09
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多