将变量从一种方法传递给另一种方法?

时间:2019-10-12 11:01:14

标签: java

假设我正在创建一副纸牌游戏,那么我的课堂上有两种方法分别称为shuffle和randomInt。

private static void shuffle(Card [] cardArray) {
    for (int i = 1; i <= 20; s++) {
        Card temp = cardArray[a];
        cardArray[a] = cardArray[b];
        cardArray[b] = temp;
    }
}

private static void randomInt(int a, int b) {   
    a = (int)(Math.random() * 12);
    b = (int)(Math.random() * 12);
}

这里的问题是如何将方法a的变量brandomInt()传递到shuffle()方法中?我知道我可以简单地将randomInt()放在shuffle()内,它可以正常工作,但是我想知道是否有任何方法可以做到这一点。

由于我对OOP还是陌生的,因此也会有人对此概念进行解释,我们将不胜感激。谢谢。

5 个答案:

答案 0 :(得分:2)

让您的randomInt()返回数字并调用shuffle()内部的函数。

private static void shuffle(Card[] cardArray) {
    for (int i = 1; i <= 20; i++) {
        int a = randomInt();
        int b = randomInt();
        Card temp = cardArray[a];
        cardArray[a] = cardArray[b];
        cardArray[b] = temp;
    }
}

private static int randomInt() {   
    return (int)(Math.random() * 12);
}

这将根据randomInt()生成索引的方式来洗牌。

答案 1 :(得分:0)

u可以创建一个Deck类,并将您的逻辑和数据放在该类中

public class Deck {
    private Card[] deck = new Card[52];
    public Deck(){
        initDeck();
    }
    public void shuffle() {
        for (int i = 1; i <= 20; i++)
        {
            int a = (int)(Math.random() * 12);
            int b = (int)(Math.random() * (52 - 12));
            swap(a,b);
        }
    }
    private void swap(int a,int b){
        Card temp = deck[a];
        deck[a] = deck[b];
        deck[b] = temp;
    }
    private void print() {
       ...
    }

}

在我们主要的方法中做这样的事情

Deck d = new Deck();
deck.shuffle();
deck.print();

答案 2 :(得分:0)

如果希望应用程序从方法randomInt返回两个值a和b,则不能仅将a和b声明为参数。 Java中的方法参数是“ ByValue”参数。该方法不会更改调用方的a和b值。

首选选项:

let randomInt返回一个包含两个元素的数组。调用randomInt之后,可以在调用方方法中将数组中的值分配给变量a和b。

替代选项,通过数组的伪引用:

将仅包含一个元素的数组传递给您的方法,而不是传递a和b:

WITH TMP AS (SELECT U.user_name, B.title || 'at' || B.date book_detail, ROW_NUMBER() OVER (PARTITION BY user_name) RN
             FROM users U
             JOIN book B ON U.book_id = B.id),
 cte AS (SELECT user_name, book_detail, RN
         FROM TMP
         WHERE RN = 1
         UNION ALL
         SELECT T.user_name, C.book_detail || ', ' || T.book_detail, C.RN+1
         FROM TMP T
         JOIN cte C ON U.id = C.id
         WHERE T.user_name = C.user_name
         and C.RN + 1 = T.rn)
SELECT user_name, book_detail 
FROM cte C1
WHERE RN = (SELECT MAX(RN)
            FROM cte C2
            WHERE C1.user_name = C2.user_name)

在呼叫方,

FragmentTransaction

答案 3 :(得分:0)

在Java中,该方法无法正常工作(https://www.google.com/?q=java+call+by+value ... https://stackoverflow.com/a/40523/592355),但是您可以解决:

  • 您可以将输出变量封装在一个对象内(该修改将在方法退出后继续存在):

    使用

    class TwoInts {
       int a,b;
    }
    

    和:

    private static void randomInt(TwoInts container) {
      assert(conatiner != null);   
      container.a = (Math.random() * 12);
      container.b = (Math.random() * 12);
    }
    
  • 最直接的方法是(编写一个具有一个返回值的方法):

     private static int rand(int offset, int max) {
        return (int) (Math.random() * max) + offset;
     }
    

    ..并两次调用它:

     a = rand(0, 12);
     b = rand(0, 12);
    
  • ...

也请看看java.util.Random ...

答案 4 :(得分:-3)

您可以全局声明a和b变量

int a,b;

private static void shuffle(Card [] cardArray)
{
    for (int i = 1; i <= 20; s++)
    { 
       randomint();
       Card temp = cardArray[a];
       cardArray[a] = a;
       cardArray[b] = b;
    }
}

private static void randomInt()
{   
    a = (Math.random() * 12);
    b = (Math.random() * 12);
}