2013-03-08 105 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

相關問題