chandra liquidzey rapier Ответов: 1

(Java)что я должен вернуть в функцию int, которую я сделал для рандомизации элемента 2D-массива


Эй ребята

это может быть слишком просто, но мне действительно трудно понять, что такое return in function(я вроде как понимаю это, но в некоторых случаях это сбивает с толку), скажем, я создаю функцию для генерации 2D-массива с рандомизированными элементами, а затем мне нужно распечатать и использовать эту функцию в основном, что я должен вернуть? учитывая, что нет никаких параметров, которые я выбрасываю из main, я просто хочу использовать эту функцию в main

Вот мой код:

Что я уже пробовал:

public class Main {

    public static void main(String[] args) {
        Main main = new Main();


        System.out.println(main.map());

    }

    public int map(){
        int[][] grid = new int[10][10];
        int i=0;
        int j=0;
        int max=0;

        for(i =0; i<grid.length; i++){
            for(j = 0; j<grid[i].length; j++){
                grid[i][j] = ((int)Math.random()*10);
                System.out.print(grid[i][j]);
            }
            System.out.println("");
        }

        /*ignore this part
        if(max > grid[i][j])
        {
            max = grid[i][j];
        }
        System.out.println("");

        for(i=0; i<grid.length; i++){
            for(j=0; j<grid.length; j++){
                if(grid[i][j] == max){
                    int a = grid[i][0];
                    int b = grid[0][i];
                    System.out.println("["+a+"]"+"["+b+"]");
                }
            }
        }
        */
        return 0;
    }

}

1 Ответов

Рейтинг:
0

OriginalGriff

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

Подумайте вот о чем: вы идете в кино, а потом хотите 15 долларов с человека. Вы вручаете им 20-долларовую купюру, а они возвращают 5 долларов и позволяют вам посмотреть фильм.
Это функция возвращает целое число:

public int pay movie(int payment, int persons) {
   return payment - (persons * 15);
   }
Но если вы идете в супермаркет, вы ожидаете, что магазин позволит вам уйти с пакетом продуктов и вашей сдачей - и это вообще не вписывается в целое значение, поэтому вам нужно вернуть экземпляр класса, который содержит массив продуктов и целое значение изменения.

Если вы хотите, чтобы ваш map функция для передачи сетки обратно к тому, что ее вызвало, затем вам нужно, чтобы она возвращала массив:
public int[][] map() {
   ...
   return grid; 
   }
И измените свой код, который вызывает его, чтобы обрабатывать другой тип возвращаемого значения.


chandra liquidzey rapier

Ладно, спасибо за объяснение, я даже не знал, что вы можете сделать такую функцию для 2Darray,
но теперь проблема заключается в том, что если бы я вернул сетку, которую я рандомизировал элемент внутри цикла for
как мне вернуть эту сетку с элементами, которые были заполнены в этом цикле? потому что когда я возвращаю grid[i][j] или grid, это только ноль, потому что я не могу использовать i и j вне цикла

OriginalGriff

Нет, вы не можете - но если вы вернете весь массив вызывающему объекту, то он может использовать свои собственные i и j для доступа к массиву любым необходимым ему способом.
Подумайте об этом: "карта" не знает, что вызывающий будет делать с сеткой, поэтому она понятия не имеет, какие значения i или j она должна возвращать в любом случае, и нет никакого смысла создавать и заполнять сетку внутри функции, если вы не передадите все это обратно вызывающему, когда это будет сделано.

Я бы сделал так, чтобы функция map принимала два целочисленных параметра, которые задают размер сетки x и y (вместо того, чтобы использовать фиксированные размеры (10, 10), которые вы делаете), и возвращала всю сетку этого размера для вызывающего абонента, чтобы он делал то, что хочет.

В этом есть смысл?

chandra liquidzey rapier

Я вроде как понимаю, но не знаю, с чего начать :(
и я не знаю, как это передать, может быть, вы можете привести пример?

OriginalGriff

public int[][] map(int x, int y) {
   ...
   return grid;
   }


И затем
int[][] grid = map(10, 20);

chandra liquidzey rapier

я хотел передать свой код здесь, но он не позволяет мне, потому что немного слишком долго

СУ, то, что я сделал, по вашим словам, я сделал функцию такой

общественная int карте(тип int[][] решетки, я инт, инт Дж)

я определил размер сетки[][] на основе i и j, которые я объявил в основном, это одно и то же?
но он все еще не распечатывает сетку с рандомизированными элементами, которая была зациклена в функции

OriginalGriff

Зачем вообще пропускать сетку? Пусть функция map справится с этим и вернет всю сетку в main.

Но если вы хотите распечатать сетку, вам нужно пройти через все элементы, распечатывая каждый из них - точно так же, как если бы вы печатали их вручную!
Поэтому напишите вторую функцию, которая берет сетку (и использует ее размеры), которая содержит два вложенных цикла: один для строк и внутренний для столбцов внутри строки. Внутри петель вы печатаете каждый элемент.
public void printMap(int[][]map) {
...
}
Вы можете получить количество строк с map.length и количество столбцов для каждой строки с map[y].length
http://ice-web.cc.gatech.edu/ce21/1/static/JavaReview-RU/Array2dBasics/a2dLoop.html

chandra liquidzey rapier

так что, несмотря ни на что, я не могу просто вернуть элементы, которые были рандомизированы в функции, в основную без другой функции, чтобы распечатать ее первой?
спасибо за объяснение, очень ценю, мне очень жаль, если я не могу понять, это немного сбивает меня с толку о том, как на самом деле передача и возврат функций работают в некоторых сложных случаях

OriginalGriff

Вы можете вернуть весь массив, но если вы хотите вернуть подмножество этого массива, вам нужно будет создать новый, меньший массив и вернуть его.

Чего вы пытаетесь этим добиться? Может быть, вы пытаетесь пойти по совершенно неправильному пути, но я не могу сказать отсюда! :смеяться:

chandra liquidzey rapier

Честно говоря, нет никакой цели, только дурачиться с функцией и 2d-массивом, я пытаюсь изучить ее по частям, просто пытаюсь понять ее полностью и использовать функции в некоторых многих сложных случаях

OriginalGriff

Не пытайтесь выучить "кусочек за кусочком" - вы упустите слишком многое из того, о чем даже не подозреваете!

Возьмите книгу (или лучше курс) и следуйте ей от начала до конца. Эддисон Уэсли, как и Роксана, делает несколько хороших вещей. Курс лучше, потому что репетитор может попробовать другой способ объяснить что-то, если вы не понимаете. Но пытаться научиться этому, просто пытаясь заставить вещи работать, - не очень хороший метод, поскольку вы никогда не знаете, что вы не встречали, что может сделать его проще и / или лучше-или почему он работает, когда он работает!

chandra liquidzey rapier

Спасибо, чувак, ценю твои советы
но есть ли какая-нибудь Бесплатная книга? я тоже пытался достать книги, но в основном они очень дорогие

OriginalGriff

Для Java я не уверен - для C# есть желтая книга, но я не знаю Эквивеланта Java.
Вы можете попробовать свою местную библиотечную службу - если у них их нет, они обычно могут заказать их из регионального штаба?