Java根据元素编号重新排列数组

4

这是我的数组:

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}

2
@ Conner:尝试使用链表概念解决这个问题。重新排列数组将需要大量的时间和空间复杂度。 - karthik
2个回答

4

将索引x移动到最前面,您需要执行以下操作:

  • 记住索引x中的值
  • 使用System.arrayCopy将从0x - 1索引之间的所有内容向上移动一个索引
  • 将第一步中记住的值设置为索引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到destPos+length-1中。
您原来的示例提到了两个元素 - 虽然您可能可以更有效地完成所有这些工作,但如果事先知道了这两个元素,那么将其建模为两个moveToHead调用将更加简单。您需要注意顺序 - 例如,如果您想首先将索引6移动到头部,则需要移动索引4而不是索引3,以考虑第一次移动。

@ConnerRuhl:我提供了一个执行移动的方法 - 现在你只需要以适当的关注级别调用它。(请参见我的最后一段。) - Jon Skeet
当我尝试将对象与引用一起使用时,它会覆盖掉对象。 - Conner Ruhl
@ConnerRuhl:你需要提供比那更详细的信息——例如一个简短但完整的程序,展示出问题所在。 - Jon Skeet
@ConnerRuhl:你永远不能拥有一个对象数组 - 你只能拥有一个引用数组。但是,是的,它应该可以工作。 - Jon Skeet

2
另一个解决方案可能是通过asList方法将您的数组转换为列表,然后简单地使用removeadd方法:
List<Integer> myList = new ArrayList<Integer>(Arrays.asList(myArray));
myList.add(myList.remove(myIndex));

2
不幸的是,这样做行不通 - 从Arrays.asList获取的列表既不允许add也不允许remove。将其替换为new ArrayList<Integer>(Arrays.asList(myArray)),然后它应该可以工作。 - gustafc
1
我一直在想这个问题,但是忘记测试了。感谢您的评论,答案已经被更正了 :) - Jean Logeart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接