【问题标题】:Return multiple values from void and boolean methods从 void 和 boolean 方法返回多个值
【发布时间】:2016-02-12 06:00:10
【问题描述】:

我有以下问题:有一个计算两个整数之间相似度的布尔静态方法,我被要求返回 4 个结果:

  1. 不改变方法的返回类型,它 应该保持布尔值。
  2. 不更新/使用外部变量和对象的值

这是我到目前为止所做的(我不能将返回值从布尔值更改为其他值,例如 int,我只能使用布尔值):

public static boolean isSimilar(int a, int b) {
    int abs=Math.abs(a-b);
    if (abs==0) {
    return true;
    } else if (abs>10) {
    return false;
    } else if (abs<=5){
        //MUST return something else, ie. semi-true
    } else {
        //MUST return something else, ie. semi-false
    }
}

【问题讨论】:

  • 抛出一个包含返回值的异常,或者改变一个参数,比如int[],除非它违反了约束2。
  • 布尔值要么是真要么是假,所以你只有这两个选项。要返回这两个选项以外的任何内容,您需要将返回数据类型更改为其他内容。故事结束
  • 谁问你这个的?对我来说,这似乎是一个棘手的问题,提出问题的人有一个解决方案,可以扩展他们在问题中使用的术语的定义。
  • 今天早上在面试(实习)。信不信由你,剩下的问题都是小菜一碟,一些智商,一些Java基础知识。我想这件事有所作为,让我们现在等待结果
  • Gaaaack。我希望这不是一个面试问题。我真的质疑任何人的能力,他们认为像这样的面试问题会揭示谁更适合某个职位或实习。除非他们打算给那些说“那将是一种非常糟糕的编程方式”的受访者打分。但也许其他人可以向我解释这类问题的价值?

标签: java boolean return


【解决方案1】:

无论如何,以下是不好的做法,但是如果您可以尝试捕获异常,您实际上可以按照约定定义一些额外的输出。例如:

public static boolean isSimilar(int a, int b) {
    int abs = Math.abs(a-b);
    if (abs == 0) {
        return true;
    } else if (abs > 10) {
        return false;
    } else if (abs <= 5){
        int c = a/0; //ArithmeticException: / by zero (your semi-true)
        return true; 
    } else {
        Integer d = null;
        d.intValue(); //NullPointer Exception (your semi-false)
        return false;
    }
}

【讨论】:

  • 据我后来听到的,这是面试中接受的答案之一
  • 哦,哇,那我强烈建议离开这家公司(或寻找另一家),当这样一个糟糕的设计被认为是面试中的答案时。
【解决方案2】:

一个布尔值可以有两个值(真或假)。时期。因此,如果您无法更改返回类型或外部的任何变量(无论如何这都是不好的做法),就不可能做您想做的事。

【讨论】:

  • 除了抛出一个 RuntimeException,它会起作用,但是是一个真的糟糕的设计决策:-)
【解决方案3】:

向函数添加参数是否违反规则 2?如果没有,这可能是一个可能的解决方案:

public static boolean isSimilar(int a, int b, int condition) {
    int abs = Math.abs(a - b);
    switch (condition) {
    case 1:
        if (abs == 0) {
            return true; // true
        }
    case 2:
        if (abs > 10) {
            return true; // false
        }
    case 3:
        if (abs <= 5 && abs != 0) {
            return true; // semi-true
        }
    case 4:
        if (abs > 5 && abs <= 10) {
            return true; // semi-false
        }
    default:
        return false;
    }
}

通过调用函数 4 次(使用条件 = 1、2、3 和 4),我们可以检查 4 个结果(只有一个会返回 true,其他 3 个会返回 false)。

【讨论】:

  • 尚不清楚它是否违反规则,它可能确实,它在边界线上,但我想这个解决方案也可以接受。
猜你喜欢
  • 2021-03-11
  • 1970-01-01
  • 2015-10-03
  • 2018-01-07
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多