根据java中的索引号将元素移动到数组的前面

时间:2011-12-22 00:50:11

标签: java arrays

让我说我有阵列:

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

如何根据索引将元素移动到前面?例如:

将元素taco [5]移动到前面应该产生这个:

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

编辑: 如果int是对象,它会有所不同吗?

7 个答案:

答案 0 :(得分:7)

  1. 将您正在移动的值存储在临时int变量
  2. 将数据中的所有元素一次一个地复制到循环中
  3. 将存储在临时变量中的值分配给新位置(数组的前面,taco[0],在这种情况下)
  4. 如果它是int值或对象的数组,则没有任何区别。算法是一样的。由于Object引用数组实际上是32位或64位内存引用的数组,因此您实际上仍在复制整数。

    这是可以做到的代码 - 有几种方法可以做到这一点,但这是基本的想法:

    public int[] moveValueAtIndexToFront(int[] arrayToBeShifted, int index) {
      int valueBeingMoved = originalArray[index];
    
      for (int i = index; i > 0; i--) {
        arrayToBeShifted[i] = arrayToBeShifted[i-1];
      }
    
      arrayToBeShifted[0] = valueBeingMoved;
    
      return arrayToBeShifted;
    }
    
    • 这会将数组中指定索引处的所有值向后移动一个位置,并将值移动到前面。
    • 如果传入的索引是0,则无法移动任何内容。
    • 如果传入的索引碰巧是数组中最后一项的索引,则需要移动数组中的每个项目。如果你正在处理大型数组,并且你在数组的后期进行了大量的值转移,那么这将变得非常低效,非常快。

    如果您感到好奇,可以通过the OpenJDK project查看arraycopy的源代码。

答案 1 :(得分:5)

int[] taco = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int index = 5;
int temp = taco[index];
for(int i = index; i > 0; i--) {
    taco[i] = taco[i-1];
}
taco[0] = temp;

答案 2 :(得分:2)

int[] taco = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int indexTarget = 7;
int valueAtIndex = taco[indexTarget];
for(int i = indexTarget; i > 0; i--){
   taco[i] = taco[i-1];
}
taco[0] = valueAtIndex;

答案 3 :(得分:1)

由于Java数组具有固定大小,因此您应该创建一个新数组,并循环遍历这些元素:

/**
 * Moves the element wanted to the front of the array, and returns a new array.
 * @param array The array to adjust
 * @param position The position of the element
 * @return The adjusted array
 */
private int[] moveElement (int[] array, int position)
{
    // Create temporary array to hold values
    int[] tempArray = new int[array.length];

    // Set first value to your wanted element
    tempArray[0] = array[position];

    // Set values of array before array[position]
    for (int tempPosition = 0; tempPosition < position; tempPosition++)
    {
        tempArray[tempPosition + 1] = array[tempPosition];
    }

    // Set values of array after array[position]
    for (int tempPosition = position + 1; tempPosition < array.length; tempPosition++)
    {
        tempArray[tempPosition] = array[tempPosition];
    }

    // Return newly created array
    return tempArray;
}

答案 4 :(得分:1)

对于新添加的问题:不,它没有任何区别,你只需要使用对象类型变量的临时变量而不是int变量。

答案 5 :(得分:0)

private int[] moveToZero (int[] workOnArray, int position) { 
 workOnArray[0]=workOnArray[position]+workOnArray[0];
 workOnArray[position]=workOnArray[0]-workOnArray[position];
 workOnArray[0]=workOnArray[0]-workOnArray[position];
 return workOnArray;
}

答案 6 :(得分:0)

我写了一个样本,你可以查一下:

   public static void main(String[] args) {
        int[] taco = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int index = 2;
        int tmp = taco[0];
        int preValue;
        taco[0]=taco[index];
        for(int i=1,n=taco.length;i<n;i++){
            if(i==index+1)
                break;
            preValue = taco[i];
            taco[i]=tmp;
            tmp=preValue;
        }
        for(int i=0,n=taco.length;i<n;i++){
            System.out.println(taco[i]);
        }
    }