You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否不使用if/else、三元表达式、switch实现取余类型判断逻辑?

无分支语句实现数字类型判断逻辑

现有一段通过取余运算结合三元表达式、switch语句判断数字类型的代码:

int type1 = (number % 3 == 0 && number % 5 != 0) ? 1 : 0;
int type2 = (number % 3 != 0 && number % 5 == 0) ? 2 : 0;
int type3 = (number % 3 == 0 && number % 5 == 0) ? 3 : 0;

int result = type1 + type2 + type3;

switch (result) {
    case 1:
        return "Type 1";
    case 2:
        return "Type 2";
    case 3:
        return "Type 3";
    default:
        return String.valueOf(number);
}

请问能否不使用if、else、三元表达式、switch语句来实现该逻辑?


可行实现方案

完全可以,我们可以利用余数周期性+数组映射的方式彻底规避分支语句,核心思路如下:

由于判断条件仅依赖数字对3和5的整除性,而3和5的最小公倍数是15,所有整数对15取余的结果只会落在0-14这15种固定情况中。我们可以提前为每种余数对应的结果构建映射数组,再通过取余后的索引直接获取结果,对于需要返回原数字的情况,用Optional完成默认值替换,全程无任何分支语句。

Java代码实现

import java.util.Optional;

public String classifyNumber(int number) {
    // 索引对应 number%15 的结果,提前定义每种情况的返回值
    // null 标记需要返回原数字的情况
    String[] resultMappings = {
        "Type 3",  // 0: 同时被3、5整除
        null, null, "Type 1", null,  // 1、2、4:无匹配类型
        "Type 2", "Type 1", null, null,  // 5: 被5整除;6: 被3整除;7、8:无匹配
        "Type 1", "Type 2", null, "Type 1",  //9:被3整除;10:被5整除;11:无匹配;12:被3整除
        null, null  //13、14:无匹配
    };
    // 处理负数取余,确保索引始终在0-14范围内
    int index = (number % 15 + 15) % 15;
    // 用Optional自动替换null为原数字的字符串
    return Optional.ofNullable(resultMappings[index])
                   .orElseGet(() -> String.valueOf(number));
}

方案说明

  1. 余数周期处理:通过(number %15 +15) %15解决Java中负数取余结果为负的问题,确保索引始终落在0-14的有效范围内。
  2. 数组映射:提前将每种余数对应的结果存入数组,直接通过索引访问,无需任何分支判断。
  3. 默认值替换:用Optional.ofNullable(...).orElseGet(...)自动将标记为null的项替换为原数字的字符串,代码中无显式分支语句。

内容的提问来源于stack exchange,提问作者Shariq Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:25:37