【问题标题】:Separating array in other arrays在其他数组中分离数组
【发布时间】:2016-03-26 09:57:05
【问题描述】:

我有一个需要拆分为不同数组的数组。我有一个字符串数组,需要将其拆分为不同的页面(不同的数组)。

首先,我得到了数组的长度,使用

int size = array.length;

然后,我得到我需要的页面数,知道每个页面应该只有 10 个字符串

int numberOfPages = (int) Math.floor(size/10);

然后用户选择他想看的页面

int pageSelected = 2;

之后,我尝试拆分数组,但出现了一些异常。我试过了:

Arrays.copyOfRange(array,(0+10*(pageSelected-1),10*10+(pageSelected-1)));

当我尝试打印新数组的值时出现异常。

是否可以将数组拆分为“页面”,并将这些“页面”显示为请求?

@Edit1 我得到一个空指针异常

【问题讨论】:

  • 你得到了什么异常?
  • 你得到了什么异常。你从哪里得到的?
  • 你能粘贴堆栈跟踪吗?
  • 异常是Nullpointer堆栈跟踪没有用,因为它是由Bukkit生成的,并且没有关于代码的信息
  • @j_v_wow_d:应该是Math.ceil((double) size/10),因为整数除法已经落地了。

标签: java arrays


【解决方案1】:

错误可能出现在这一行:

Arrays.copyOfRange(array,(0+10*(pageSelected-1),10*10+(pageSelected-1)));

括号有错误的地方(该方法需要三个参数,但从方法的角度来看,您只提供两个:最后两个用括号分组)。您可以使用:

Arrays.copyOfRange(array,10*(pageSelected-1),10*10+(pageSelected-1));

(删除0+,因为这没有用)。

此外,您还犯了一个语义错误:10*10+(pageSelected-1) 应替换为:10+10*(pageSelected-1

所以整行内容如下:

Arrays.copyOfRange(array,10*(pageSelected-1),10+10*(pageSelected-1));

虽然更好的指导方针是使用小步骤:

int i = pageSelected-1;
int g = 10*i;
Arrays.copyOfRange(array,g,g+10);//do something with the result

为了做到完美,您最好将变量用于常量,这样 - 如果您改变主意 - 您可以轻松地修改每页的项目数:

int i = pageSelected-1;
int perpage = 10;
int g = perpage*i;
Arrays.copyOfRange(array,g,g+perpage);//do something with the result

最后说一句:正如@j_v_wow_d 所说,你应该ceil 划分,否则你会为11 项目生成一个页面。 numberOfPages 的正确代码如下:

int numberOfPages = (int) Math.ceil((double) size/perpage);

【讨论】:

  • 对于我的学习目标,你能解释一下 10*(pageSelected-1) 是什么意思,op 是怎么想出来的?
  • 10 是每页的项目数。 OP 使用 1 的偏移量 pageSelected。因此,您将其递减以获得 Java 数组索引。获取真实页面(pageSelected-1)。然后将它乘以10,因为每个页面都有10 项。获取偏移项。
  • 并且每个页面都在数组的每个索引中或从零到九算作一页?
  • 我猜 OP 通过打印网页或显示这些项目的东西来处理子数组。现在当然也可以通过使用带有计算偏移量的索引来进行数学计算。然而,通过复制它,事情可以做得更简单。
  • 很好的解释我认为你应该把这个添加到你的帖子中更完美谢谢
【解决方案2】:

如果 pageSelected 被索引,那么 0 是第一个:

String[] array = {"a", "b", "c", "d", "e", "f"};
int pageSize = 2;
int pageSelected = 2;
final String[] pageData =
        Arrays.copyOfRange(
                array,
                (pageSelected * pageSize),
                (pageSelected * pageSize) + pageSize);

这样的结果是pageData 包含 ["e", "f"]。

【讨论】:

    【解决方案3】:

    你可以这样做size / 10;无需floor 或强制转换。

    另外,from 表达式 10*10+(pageSelected-1) 应该是 10 + (10 * (pageSelected - 1))

    【讨论】:

    • 还有一个小括号错误......但这确实不是重要的部分。
    【解决方案4】:
    Arrays.copyOfRange(array,(0+10*(pageSelected-1),10*10+(pageSelected-1)));
    

    我想你是这个意思:)

    Arrays.copyOfRange(array,0+10*(pageSelected-1),10+10*(pageSelected-1));
    

    查看第二个逗号后+*的位置。

    但是,如果不是单行的话会更容易阅读

    int offset = 10 * (pageSelected - 1);
    Arrays.copyOfRange(array, offset, offset + 10);
    

    甚至更好

    public static final int PER_PAGE = 10; 
    
    /* (...) */
    
    int offset = PER_PAGE * (pageSelected - 1);
    Arrays.copyOfRange(array, offset, offset + PER_PAGE);
    

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2011-11-13
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多