Как мне вернуть массив из метода? - PullRequest
2 голосов
/ 20 марта 2012

Я пытаюсь создать колоду карт для домашней работы. Код размещен ниже. Мне нужно создать
Четыре набора карт (четыре масти) и я создаем многомерный массив. Когда я печатаю результаты вместо того, чтобы пытаться передать массив, я вижу, что данные в массиве соответствуют ожиданиям. Однако, когда я пытаюсь передать массив card, я получаю ошибку cannot find symbol. Я смоделировал это после примеров учебников по texbook и Java, и мне нужна помощь, чтобы выяснить, чего мне не хватает. Я перефразировал документально, чтобы дать представление о том, как я думаю, что это ДОЛЖНО работать ... пожалуйста, дайте мне знать, где я ошибся в своем понимании.

import java.util.*;
import java.lang.*;
//
public class CardGame
{
    public static int[][] main(String[] args)
    {
        int[][] startDeck = deckOfCards();  /* cast new deck as int[][], calling method deckOfCards
        System.out.println(" /// from array: " + Arrays.deepToString(startDeck));
    }

    public static int[][] deckOfCards()   /* method to return a multi-dimensional array */
    {
        int rank;
        int suit; 
        for(rank=1;rank<14;rank++)    /* cards 1 - 13 .... */
        {
            for(suit=1;suit<5;suit++)  /* suits 1 - 4 .... */
            {
                int[][] card = new int[][]    /* define a new card...  */
                {
                    {rank,suit}      /* with rank/suit from for... loops */
                };
                System.out.println(" /// from array: " + Arrays.deepToString(card));
             }
         }
         return card;  /*  Error: cannot find symbol 
    }
}

Ответы [ 5 ]

4 голосов
/ 20 марта 2012

card существует только в цикле for: переменные действительны только в блоке ({..}), в котором они объявлены.

Примечание правила для метода main() (из раздела 12.1.4 Invoke Test.main из JLS 3.0 ):

Метод main должен быть объявлен как public, static и void.Он должен принимать один аргумент, представляющий собой массив строк.

2 голосов
/ 20 марта 2012

Ааа ... Сфера - это ваша проблема ... Посмотрите, где объявлена ​​карта относительно того, откуда она возвращается. Помните, когда вы объявляете переменную в цикле или подфункции, ее область действия ограничена этим местоположением в стеке. Если это не поможет, сообщите мне обратно.

1 голос
/ 20 марта 2012

Ваша карта была определена в цикле for. Попробуйте определить его сверху, иначе он будет переопределен в каждом цикле, и ваша функция вернет ноль.

import java.util.*;
import java.lang.*;
//
public class CardGame
{
    public static int[][] main(String[] args)
    {
        int[][] startDeck = deckOfCards();  /* cast new deck as int[][], calling method deckOfCards
        System.out.println(" /// from array: " + Arrays.deepToString(startDeck));
    }

    public static int[][] deckOfCards()   /* method to return a multi-dimensional array */
    {
        int rank;
        int suit; 
        int[][] card = new int[][]    /* define a new card...  */
        for(rank=1;rank<14;rank++)    /* cards 1 - 13 .... */
        {
            for(suit=1;suit<5;suit++)  /* suits 1 - 4 .... */
            {

                {
                    {rank,suit}      /* with rank/suit from for... loops */
                };
                System.out.println(" /// from array: " + Arrays.deepToString(card));
             }
         }
         return card;  /*  Error: cannot find symbol 
    }
}
1 голос
/ 20 марта 2012

Эталонная карта ограничена областью действия вашего внутреннего цикла for.Переменная существует только внутри самого внутреннего набора фигурных скобок {}, которые ее заключают.

Вы хотите создать один массив вне цикла и заполнить его в цикле.Не создавать совершенно новый массив для каждого прохода цикла.

0 голосов
/ 21 марта 2012

Спасибо всем, кто указал на объем как на мою проблему ... это было определенно.Вот мой пересмотренный код, о котором я рад сообщить, работает фантастически.

import java.util.*;
import java.lang.*;
//
public class CardGame 
{
    static int card[][];   /* card is now a global variable...and static so it can */
                           /* interact with static methods.  */
//
    public static void main(String[] args)
    {
        int card[][];
        int[][] startDeck = deckOfCards();
        System.out.println(" /// from array: " + Arrays.deepToString(startDeck));
    }


    public static int[][] deckOfCards()
    {
        int rank;
        int suit;
        for(rank=1;rank<14;rank++)
        {
            for(suit=1;suit<5;suit++)
            {
                card = new int[][]
                {
                    {rank,suit}
                };
                System.out.println(" /// from array: " + Arrays.deepToString(card));
             }
         }
         return card;
    }   
}
...