【问题标题】:Java rearrange array based on element numberJava根据元素编号重新排列数组
【发布时间】:2012-01-24 05:10:02
【问题描述】:

这是我的数组:

int[] myArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

假设我想将 myArray[3](它可以是任何元素)和 myArray[6](与这个相同)移动到数组的前面,同时重新排列后面,我该怎么做?示例:

这个:

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

进入这个:

{3, 6, 0, 1, 2, 4, 5, 7, 8, 9}

【问题讨论】:

  • @Conner:尝试使用链表概念解决这个问题。重新排列数组会花费很多时间和空间复杂度。

标签: java arrays for-loop


【解决方案1】:

要将索引x 移到前面,您需要:

  • 记住索引 x 的内容
  • 0x - 1 的所有内容向上复制一个索引,例如与System.arrayCopy
  • 将索引0处的值设置为您在第一步中记住的值

例如:

public void moveToHead(int[] values, int index)
{
    // TODO: Argument validation
    int value = values[index];
    System.arraycopy(values, 0, values, 1, index - 1);
    values[0] = value;
}

请注意,System.arraycopy 会正确处理复制:

如果 src 和 dest 参数引用同一个数组对象,则执行复制,就好像首先将位置 srcPos 到 srcPos+length-1 的组件复制到具有长度组件的临时数组,然后复制临时数组通过目标数组的 destPos+length-1 复制到位置 destPos 中。

您的原始示例提到了两个元素 - 虽然您可以提前知道这两个元素可能会更有效地完成所有这些,但将其建模为两个 moveToHead 调用会简单得多。您需要注意排序 - 例如,如果您想先将索引 6 移动到头部,那么您需要移动索引 4 而不是索引 3,以考虑第一次移动。

【讨论】:

  • @ConnerRuhl:我已经提供了一种方法来进行移动——现在你只需要在调用它时小心谨慎。 (见我的最后一段。)
  • 当我尝试使用对象时,它会覆盖带有引用的对象
  • @ConnerRuhl:你需要提供比这更多的细节——比如一个简短但完整的程序来演示问题。
  • @ConnerRuhl:你永远不可能有一个对象数组——你只能有一个引用数组。但是,是的,它应该可以工作。
【解决方案2】:

另一个解决方案可能是将数组转换为列表,这要归功于asList 方法,并且只需使用removeadd 方法:

List<Integer> myList = new ArrayList<Integer>(Arrays.asList(myArray));
myList.add(myList.remove(myIndex));

【讨论】:

  • 不幸的是,这不起作用 - 您从 Arrays.asList 获得的列表既不允许 add 也不允许 remove。用new ArrayList&lt;Integer&gt;(Arrays.asList(myArray)) 替换它,它应该可以工作。
  • 我想知道但忘了测试它。感谢您的评论,答案已更正:)
猜你喜欢
  • 2016-07-26
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多