【问题标题】:calculating integer to array location java计算整数到数组位置java
【发布时间】:2013-01-28 14:29:13
【问题描述】:

不明白如何解决这个问题。 我需要接受座位号作为参数(座位)。然后将该座位号转换为二维数组的行列索引。

为了检查我自己,我一直假设有 10 排 (0-9) 和 2 个席位每排 (0-1),然后从 1-20 中挑选一个座位来检查数学。但是可以有任意数量的行和列。这正是我用来检查自己的。

static void isAvailable(int seat, boolean seat[][]) {

    int row = 0;
    int column = 0;

    if (seat > 0 && seat <= (getRows() * getSeatsPerRow())){
        row = (seat ) % getRows();
        column = (seat - 1) % getSeatsPerRow;
        seat[row][column] = false;
    }
}

假设座位是这样安排的:

            seatsPerRow
       0   1   2   3   4   5   6 

    0 (1) (2) (3) (4) (5) (6) (7)

 r  1 (8) (9) (10)(11)(12)(13)(14)

 o  2 (15)(16)(17)(18)(19)(20)(21)

 w  3  ...

 s  4  ...

    .

    .

    .

假设我想找到 11 号座位。它将是座位 [1][3]。我不明白如何将座位号转换为二维数组上的位置。

【问题讨论】:

    标签: java if-statement multidimensional-array modulo


    【解决方案1】:

    好吧,假设座位从 1 开始编号,您可以简单地使用以下方法获取列索引:

    int column = (seatNum - 1) % seat[0].length;
    

    然后您可以使用简单的表达式找到该行:

    int row = (int) ((seatNum - 1) / seat[0].length);
    

    然后,您将通过以下方式获得实际元素:

    seats[row][column]
    

    这两个表达式都应该适用于seat 数组的所有维度(0 x 0 除外)。

    第一行将使用模数来找到seatNum / seat[0].length余数,或者基本上是座位数除以每排座位数。这会将column 重构为正确的范围。

    接下来,第二行将座位数除以一排的长度,这将找到该排本身。然后我们将其转换为带有(int) 的int,这会截断它,删除可能由操作产生的任何小数。在这种情况下,我们实际上是在执行纯整数数学运算,因此不需要强制转换。

    【讨论】:

    • 席位[0]是什么意思?这是一个二维数组。我只了解java的基础知识。
    • @user1368970 它将获取数组的第一个 。然后我们可以使用.length 来获取行的长度,而不是外部数组的长度,即行数,也就是列的长度。
    • 我仍然没有正确理解,当我进行数学运算时,它没有得到正确的行号或列号。请检查我的更新。
    • 好的!现在完全明白了!非常感谢!
    • 真的有必要强制转换成int吗?
    【解决方案2】:

    假设座位安排是这样的:

     1  2
     3  4
     5  6
     7  8
     9 10
    11 12
    13 14
    15 16
    17 18
    19 20
    
    
    
    int col = (seat % 2 == 0)? 1:0;
    int row = (int)Math.ceil(seat / 2.0f); 
    

    【讨论】:

    【解决方案3】:

    模数运算符在这里非常有用,因为它可以确定我们最终要使用哪个座位。

    首先,让我们接受我们的假设并将它们转换为更抽象的东西:

    • 有 N 个座位,其中 N = 20。我们将 N 作为我们的行。
    • 有 K 行,其中 K = 2。我们将 K 作为列。
    • 鉴于此,每排有 N/K 个座位。

    现在,我们可以使用一些模数数学来解决剩下的问题。现在让我们声明我们的座位数组。

    boolean[][] seats = new boolean[N][K]; //presumed
    

    如果我们想要抢占 13 号座位,那么我们需要弄清楚两件事:

    • 座位在哪
    • 座位在哪个

    鉴于上述情况,该行的数学运算如下:

    int row = (seatWanted % N)-1; // (13 % 10)-1 = 2.
    

    现在,该列同样很容易找到 - 不过,我们将使用整数除法而不是模数。

    int column = seatWanted / K; // 13 / 10 = 1.
    

    剩下的部分是读者的练习,但我们希望将seats[2][1] 标记为已使用。

    【讨论】:

    • 那么,在写这个类的时候,n和k会是rows和seatsPerRow(即column)的参数吗?
    • 最终我认为您可以使用.length 将每个行和列的长度从数组中拉出。 N 和 K 用于说明目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多