2013-03-08 154 views
6

我正在使用模拟器来玩掷骰子,我试图从相同的方法返回两个值(或者我想)。是否有可能从Java中的方法返回多个值?

当我编写我的return语句时,我只是试着把编译和运行正确的“&”但我无法访问第二个返回的值。

public static int crapsGame(){ 
    int myPoint; 
    int gameStatus = rollagain; 
    int d1,d2; 
    int rolls=1; 

    d1 = rollDice(); 
    d2 = rollDice(); 
    switch (d1+d2) { 
    case 7: 
    case 11: 
     gameStatus = win; 
     break; 
    case 2: 
    case 3: 
    case 12: 
     gameStatus = loss; 
     break; 
    default: 
     myPoint = d1+d2; 
     do { 
     d1=rollDice(); 
     d2=rollDice(); 
     rolls++; 
     if (d1+d2 == myPoint) 
      gameStatus = win; 
     else if (d1+d2 == 7) 
      gameStatus = loss; 
     } while (gameStatus == rollagain); 
    } // end of switch 
    return gameStatus & rolls; 
} 

当我返回的值:

gameStatus=crapsGame(); 

处理器设置varaible赢或输,但如果我尝试简单的东西如下这句话有:

rolls=crapsGame(); 

它被赋予与gamestatus ... a 0或1(赢或输)相同的值。 任何我可以访问第二个返回值的方式?还是有一种完全不同的方式去做呢?

+0

使用对象或散列图或模型类的数组 – 2013-03-08 01:39:43

+5

不,它不是。您可以返回一个对象,但该对象可以包含多个属性 – 2013-03-08 01:39:51

+0

您应该返回一个int []。结帐http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – sissonb 2013-03-08 01:40:26

回答

9

创建您自己的值持有者对象来保存两个值,然后返回它。

return new ValueHolder(gameStatus, rolls); 

有可能返回一个具有多个值的数组,但这很神秘,它对可读性没有任何作用。这很容易理解这意味着什么...

valueHolder.getGameStatus() 

比这意味着什么。

intArray[0] 
+0

我还会返回一个值权利人吗?如在声明中所示: gameStatus = crapsGame(); 什么将持有价值持有者的价值;如果那有意义的话? 对不起,如果这听起来可笑的白痴......我完全不熟悉ValueHolder – OscarWilde 2013-03-08 01:49:49

+0

ValueHolder是一个你会做的类 - 一个自定义对象。然后你会写'ValueHolder valueHolder = crapsGame();' – rgettman 2013-03-08 01:51:36

+0

谢谢!我使用数组方法,因为它稍微简单一些(因为我只需要两个值),但是我很欣赏这种方法的回复和优点!另外,我学到了一些总是很好的东西;因为我从来没有听说过“ValueHolder”! – OscarWilde 2013-03-08 02:01:43

5

返回gameStatus & rolls的意思是“返回并gameStatus和辊的按位”,这可能不是你想要

你有一些选择在这里:

  • 返回数组
  • 创建一个类代表每个值的属性的响应并返回一个实例
  • 使用许多Java集合中的一个来重新创建打开数值(可能是列表或地图)
+0

我的确用数组方法结束了,但是我想知道你是否可以在“按位返回并返回gameStatus并且滚动”的时候展开一些操作。当我以这种方式进入时,我实际返回了什么? – OscarWilde 2013-03-08 02:06:01

+0

@OscarWilde确定:按位和运算符&将在其两个操作数上每次应用一个逻辑和一个位(请查看:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html ) – 2013-03-19 19:13:57

3

您可以返回一个数组值或一组值。

3

是否有可能从Java中的方法返回多个值?

不,它不是。 Java只允许返回一个值。这种限制是硬连接到语言。

不过,也有对付这种限制的几种方法:

  • 写有您要返回多个值的字段重量轻的“持有”级,创建并返回的实例那个班。
  • 返回包含值的Map。这个(和下一个)方法的问题是你正在进入一个需要运行时类型检查的区域......这可能导致脆弱性。
  • 返回包含值的数组。该数组必须有一个基类型,以适应所有值的类型。
  • 如果这是一个对象的方法,那么在同一个对象和方法中添加一些字段,以允许调用者从上次调用中选取“辅助结果”。 (例如,JDBC ResultSet类执行此操作时允许客户端确定刚刚检索的值是否为NULL。)问题是,这使得该类在实例级别不可重入。
  • (你甚至可以返回静额外的结果,但它是一个非常糟糕的主意。它使所有的实例类非折返,更不用说与误用静态相关的其他badnesses的。)

其中,第一个选项是最干净的。如果您担心创建持有者实例等开销,可以考虑重用实例;例如让调用者将一个现有的“持有者”传递给调用结果的方法。

0

您可以通过以下方式来做到这一点:

  1. 使用一个容器类,例如

    public class GameStatusAndRolls { 
        String gameStatus; 
        String rolls; 
        ... // constructor and getter/setter 
    } 
    public static GameStatusAndRolls crapsGame(String gameStatus, String rolls) { 
        return new GameStatusAndRolls(gameStatus, rolls); 
    } 
    public static void main(String[] args) { 
        ... 
        GameStatusAndRolls gameStatusAndRolls = crapsGame(gameStatus, rolls); 
        gameStatusAndRolls.getGameStatus(); 
    
  2. 使用Listarray,例如

    public static List<Integer> crapsGame(String gameStatus, String rolls) {   
        return Arrays.asList(gameStatus, rolls); 
    } 
    private static final int GAME_STATUS = 0; 
    private static final int ROOLS = 0; 
    public static void main(String[] args) { 
        ... 
        List<Integer> list = crapsGame(gameStatus, rolls); 
        ... list.get(0)...list.get(GAME_STATUS); 
        ... list.get(1)...list.get(ROOLS); 
    

    public static String[] crapsGame(String gameStatus, String rolls) {   
        return new String[] {gameStatus, rolls}; 
    } 
    private static final int GAME_STATUS = 0; 
    private static final int ROOLS = 0; 
    public static void main(String[] args) { 
        ... 
        String[] array = crapsGame(gameStatus, rolls); 
        ... array[0]...array[GAME_STATUS]; 
        ... array[1]...array[ROOLS]; 
    
  3. 使用Map,例如

    public static Map<String, String> crapsGame(String gameStatus, String rolls) { 
        Map<String, String> result = new HashMap<>(2); 
        result.put("gameStatus", gameStatus);   
        result.put("rolls", rolls); 
        return result; 
    } 
    public static void main(String[] args) { 
        ... 
        Map map = crapsGame(gameStatus, rolls); 
        ... map.get("gameStatus")...map.get("rolls"); 
    
2

为一个面向对象的方法最好的做法是返回一个对象。一个包含所有您想要的值的对象。

例子:

class Main { 

    public static void main(String[] args) { 

     MyResponse response = requestResponse(); 

     System.out.println(response.toString()); 

    } 

    private static MyResponse requestResponse() { 

     return new MyResponse("this is first arg", "this is second arg"); 
    } 
} 

class MyResponse { 

    private String x, y; 

    public MyResponse(String x, String y) { 

     this.x = x; 
     this.y = y; 

    } 

    @Override 
    public String toString() { 

     return "x: " + x + "\t y: " + y; 
    } 

} 

如果你想要一个更加可扩展的方法,那么你必须使用JSON响应。 (让我知道如果你想用JSON的例子)

+0

这个问题来自3年前...为什么我今晚突然得到两个新的答案? – OscarWilde 2016-02-08 01:21:06

+0

刚刚显示给“最新”版块的人。不知道。 – NikosKeyz 2016-02-08 01:24:25

相关问题