如何从 while 循环中返回 2 个布尔值?爪哇

Posted

技术标签:

【中文标题】如何从 while 循环中返回 2 个布尔值?爪哇【英文标题】:How do i return 2 boolean values from a while loop? Java 【发布时间】:2015-07-20 14:13:38 【问题描述】:

我尝试返回 correctPiece 和 correctDest 但是

return correctPiece;

加下划线并出现错误“无法访问代码”。

如何同时退货?

   while(correctPiece && !correctDest) 

            System.out.println("Click on a destination");

            toXCo = s.getToXInt();
            toYCo = s.getToYInt();

            Move found = null;

            for( Move m : moves)
                //checks if move can be done
                if (m.ToX() == toXCo && m.ToY() == toYCo)
                    //if move is allowed- exit loop
                    found = m; 
                    correctDest = true;
                
            

            if (found == null) 
                //if move can't be, ask for new co-ordinates
                System.out.println("This move is not legal \n");
                    correctDest = false;
                    correctPiece = false;
               
            return correctDest;
            return correctPiece;
        

【问题讨论】:

你不能从一个函数返回多个值。为确保这两个值都反映到您调用的位置,请通过引用传递它们。 【参考方案1】:

通过将您的 return 类型更改为 boolean[] 并使用类似的东西

return new boolean[]  correctDest, correctPiece ;

【讨论】:

【参考方案2】:

您可以创建一个包含您要返回的布尔值的类,并创建该类的一个对象并返回它。

这种方法更好的原因是,如果你想在将来扩展响应,添加更多参数,如果你有一个对象被返回,这样做总是更容易。

在这种情况下,您的代码看起来像

while(correctPiece && !correctDest) 

        System.out.println("Click on a destination");

        toXCo = s.getToXInt();
        toYCo = s.getToYInt();

        Move found = null;

        for( Move m : moves)
            //checks if move can be done
            if (m.ToX() == toXCo && m.ToY() == toYCo)
                //if move is allowed- exit loop
                found = m; 
                correctDest = true;
            
        

        if (found == null) 
            //if move can't be, ask for new co-ordinates
            System.out.println("This move is not legal \n");
                correctDest = false;
                correctPiece = false;
           
        return new Response(correctDest, correctPiece);
    

您可以创建一个响应类来捕获两个值,例如

private static class Response 

    boolean correctDest;
    boolean correctPiece;
    public Response(boolean correctDest, boolean correctPiece) 
        super();
        this.correctDest = correctDest;
        this.correctPiece = correctPiece;
    



【讨论】:

这是最好的解决方案。如果你用一些代码演示了返回值类及其使用的例子,我会认为它是最好的答案。 当然。添加了一个示例。【参考方案3】:

您可以将返回类型更改为 boolean[],以便返回 2 个布尔值。

【讨论】:

【参考方案4】:

"return" 终止你的方法并返回值。 return 以下的所有内容都无法访问。

尝试将返回类型更改为 bolean[],并将您的代码更改为如下所示:

boolean temp[] = correctDest, correctPrice;
return temp;

【讨论】:

【参考方案5】:

Return 关键字退出你的方法,所以当它第一次遇到 return correctDest; 它会退出你的方法。据我所知,您可以将该代码修改为:

if (m.ToX() == toXCo && m.ToY() == toYCo) 
    return true;

而不是返回正确的目的地;并返回正确的片段;只是返回假。 您实际上不需要返回这两个值。

if (found == null)
   return false;

那就去吧

 correctDest = methodreturn();
 correctPiece = methodreturn(); // since it's true in order to enter the loop

其他方法:

public class Bols 
private boolean corDes; 
private boolean corPiece; 
add getters and create a constructor
public Bols(boolean corDes, boolean corPiece) 
this.corDes = corDes; this.corPiece = corPiece;
 

然后创建

Bols object = new Bols(boolean correctDest, boolean correctPiece);
return Bols;

使用 getter 检索您的布尔值;

【讨论】:

【参考方案6】:

当我想返回多个值时,例如一个复杂的结果,我会为它创建一个新类。这使代码更易于阅读。

除此之外,你的代码很乱,因为:

correctPiece 在循环中根本没有改变 if() 块中 correctDest 的重置是多余的,并且 correctPiece 的重置是不必要的,甚至可能是错误的,这取决于 while ( ) 找到根本不需要 return 语句应该在循环之外;在您的示例中,return 语句将在第一个循环中执行,用户将不会有第二次点击目的地的机会

我对代码的提议是这样的

////
public class UserInputValidationResult 
    boolean correctPiece;
    boolean correctDest;

    public UserInputValidationResult(boolean correctPiece, boolean correctDest) 
        this.correctPiece = correctPiece;
        this.correctDest  = correctDest;
    

    public boolean getCorrectPiece() 
        return correctPiece;
    

    public boolean getCorrectDest() 
        return correctDest;
    

/////

// I suppose this happens somewhere before the while()
correctPiece = true;
correctDest  = false;

while(correctPiece && !correctDest) 

    System.out.println("Click on a destination");

    toXCo = s.getToXInt();
    toYCo = s.getToYInt();

    Move found = null;

    for( Move m : moves)
        //checks if move can be done
        if (m.ToX() == toXCo && m.ToY() == toYCo)
            //if move is allowed- exit loop
            found = m; 
            correctDest = true;
        
    

    if (found == null) 
        //if move can't be, ask for new co-ordinates
        System.out.println("This move is not legal \n");
    


return new UserInputValidationResult(correctPiece, correctDest);

但我不确定它是否是您正在寻找的代码的最终版本。

如果您不熟悉编程和学习循环、函数、数据类型和返回语句,请在开始时尝试一些更简单的东西。尝试将复杂的语句拆分为较短的语句。例如,将内循环移动到函数中:

private boolean isCorrectDest(toXCo, toYCo) 
    boolean result = false;

    Move found = null;
    for( Move m : moves)
        //checks if move can be done
        if (m.ToX() == toXCo && m.ToY() == toYCo)
            //if move is allowed- exit loop
            found = m; 
            result = true;
            break;
        
    

    return result; // and why did we define found?


while(correctPiece && !correctDest) 

    System.out.println("Click on a destination");
    toXCo = s.getToXInt();
    toYCo = s.getToYInt();

    correctDest = isCorrectDest(toXCo, toYCo);
    if (!correctDest) 
        //if move can't be, ask for new co-ordinates
        System.out.println("This move is not legal \n");
    

【讨论】:

以上是关于如何从 while 循环中返回 2 个布尔值?爪哇的主要内容,如果未能解决你的问题,请参考以下文章

初学者问题:从 Python 中的函数返回布尔值

如何在这个 GPA 计算器中构建我的 for 循环?爪哇

While 循环计时如何在带有多个线程的 C# 中工作?

初入javascript知识点

在while循环中将布尔值更改为true? C++

为啥这不会一遍又一遍地返回一个新值?爪哇