2013-03-08 10 views
6

Używam symulatora do gry w kości i próbuję zwrócić dwie wartości z tej samej metody (lub raczej chciałbym).Czy jest możliwe zwrócenie więcej niż jednej wartości z metody w Javie?

Kiedy napisałem zwrot, po prostu próbowałem wstawić "&", który skompilował i działał poprawnie; ale nie mam dostępu do drugiej zwróconej wartości.

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; 
} 

Kiedy wrócę wartości jak:

gameStatus=crapsGame(); 

on odpowiednio ustawia varaible wygrać lub stracić, ale gdy próbuję coś tak prostego jak po to oświadczenie z:

rolls=crapsGame(); 

Ma przypisaną tę samą wartość co gamestatus ... a 0 lub 1 (wygrana lub przegrana). W jaki sposób mogę uzyskać dostęp do drugiej zwróconej wartości? A może jest zupełnie inny sposób na zrobienie tego?

+0

użyj tablicy obiektów lub hashmap lub modelu klasy –

+5

Nie, nie jest. Możesz jednak zwrócić obiekt i ten obiekt może zawierać wiele właściwości. –

+0

Powinieneś zwrócić int []. Zamówienie http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – sissonb

Odpowiedz

9

Utwórz własny obiekt właściciela wartości, aby przytrzymać obie wartości, a następnie go zwróć.

return new ValueHolder(gameStatus, rolls); 

Możliwe jest zwrócenie tablicy z wieloma wartościami, ale jest to zagadkowe i nie ma znaczenia dla czytelności. Znacznie łatwiej zrozumieć, co to oznacza ...

valueHolder.getGameStatus() 

niż to oznacza.

intArray[0] 
+0

Co zwrócę również wartość dodaną? Jak w oświadczeniu: gameStatus = crapsGame(); co trzymałoby wartość posiadacza wartości; jeśli to ma jakiś sens? Przepraszam, jeśli brzmi to absurdalnie idiotycznie ... zupełnie nie jestem zaznajomiony z ValueHolder – OscarWilde

+0

ValueHolder to klasa, którą zrobisz - obiekt niestandardowy. Następnie napisz coś w stylu 'ValueHolder valueHolder = crapsGame();' – rgettman

+0

dziękuję! Poszedłem z metodą tablicy, ponieważ było nieco prostsze (widząc, jak potrzebuję tylko dwóch wartości), ale doceniam odpowiedź i zalety tej metody! Poza tym dowiedziałem się o czymś ekstra, co zawsze jest miłe; ponieważ nigdy nie słyszałem o "ValueHolder"! – OscarWilde

5

powrocie gameStatus & rolls oznacza „powrót bitowego i gameStatus i bułki”, który prawdopodobnie nie jest to, co chcesz

masz kilka możliwości:

  • zwraca tablicę
  • tworzyć klasa, która reprezentuje odpowiedź z właściwością dla każdej wartości i zwraca instancję
  • użyć jednej z wielu kolekcji java do ponownego obróć wartości (prawdopodobnie listy lub mapy)
+0

Skończyłem z metodą tablicową, ale zastanawiałem się, czy można rozszerzyć nieco na "return bitwise i gameStatus i rolls". Co właściwie wróciłem, gdy już to wprowadziłem? – OscarWilde

+0

@OscarWilde sure: bitowe i operator & będą stosować logikę ORAZ jeden za jednym razem na dwóch operandach (sprawdź to: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html) –

3

Możesz zwrócić tablicę wartości lub zbiór wartości.

3

Czy jest możliwe zwrócenie więcej niż jednej wartości z metody w Javie?

Nie, nie jest. Java pozwala na zwrócenie tylko jednej wartości. To ograniczenie jest ściśle związane z językiem.

Jednakże, istnieje kilka metod radzenia sobie z tym ograniczeniem:

  • Napisz lekki klasę „posiadacz” z polami dla wielu wartości chcesz powrócić, a także tworzyć i zwracać instancję ta klasa.
  • Zwróć wartość Map zawierającą wartości. Problem z tym (i następnym) podejściem polega na tym, że wkraczasz w obszar, który wymaga sprawdzenia typu środowiska wykonawczego ...a to może prowadzić do niestabilności.
  • Zwraca tablicę zawierającą wartości. Tablica musi mieć typ bazowy, który będzie uwzględniał typy wszystkich wartości.
  • Jeśli jest to metoda na obiekcie, dodaj kilka pól tego samego obiektu i metod, które umożliwiają wywołującym pobranie "wyników pomocniczych" z ostatniego połączenia. (Na przykład klasa JDBC ResultSet robi to, aby umożliwić klientowi ustalenie, czy pobrana wartość była wartością NULL.) Problem polega na tym, że powoduje to, że klasa nie jest ponownie obecna na poziomie instancji.
  • (Można nawet wrócić dodatkowe wyniki w statyce, ale jest to naprawdę zły pomysł. To sprawia, że ​​klasa non-reentrant we wszystkich przypadkach, nie wspominając o wszystkich innych badnesses związanych z błędną statyki.)

Spośród nich pierwsza opcja jest najczystsza. Jeśli niepokoi Cię obciążenie związane z tworzeniem instancji właściciela itp., Możesz rozważyć ponowne użycie instancji; na przykład niech dzwoniący przekaże istniejącego "posiadacza" do wywoływanej metody, w której wyniki powinny zostać umieszczone.

0

Można następujących sposobów, aby to zrobić:

  1. użyć klasy pojemnika, na przykład

    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. użytkowania List lub array np

    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); 
    

    lub

    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. Zastosowanie Map np

    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

Najlepszą praktyką jest podejście OOP jest powrót obiektu. Obiekt zawierający wszystkie pożądane wartości.

Przykład:

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; 
    } 

} 

Jeśli chcesz jeszcze bardziej skalowalne podejście to trzeba użyć odpowiedzi JSON. (daj mi znać, jeśli chcesz mieć również przykład z JSONem)

+0

To pytanie pochodzi sprzed 3 lat ... dlaczego nagle otrzymałem dwie nowe odpowiedzi? – OscarWilde

+0

Po prostu wyświetlany do "najnowszej" sekcji mężczyzna. Nie wiem. – NikosKeyz

Powiązane problemy