2012-03-22 2 views
3

Вот что раскладкаДобавить элемент в массив Java

index num 
0  [10] 
1  [20] 
2  [30] 
(Add 35 here) 
3  [40] Move elements down 
4  [50] 
5  [60] 
6  [70] 

тогда мой метод это

public static void method(int[] num, int index, int addnum) 
{ 

} 

Как я могу добавить 35 там?

Пробовал так:

public static void method(int[] num, int index, int addnum) 
{ 
int index = 10; 
for(int k = num.length k>3; k++) 
{ 
     Num[k]=num[k++] 
} 
    Num[3] = 35; 
+1

малоизвестный факт, вы можете использовать Arrays.binarySearch найти индекс, где вы должны вставить его (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays .html). –

+0

Вы на правильном пути с тем, что вы пробовали, но после копирования над значением, которое вы хотите добавить, вам нужно добавить конец исходного массива. – DukeOfMarmalade

ответ

1

Вы должны

  1. выделить новый массив с комнатой для одного нового элемента.

    int[] newArray = new int[oldArray.length + 1]; 
    
  2. Скопируйте все элементы и оставите место для вставки.

    for (int i = 0; i < newArray.length - 1; i++) 
        newArray[i < insertIndex ? i : i + 1] = oldArray[i]; 
    
  3. Вставить 35 в пустое место.

    newArray[insertIndex] = numberToInsert; 
    

Обратите внимание, что это не можно сделать в методе, как это:

public static void method(int[] num, int index, int addnum) 
       ^^^^ 

, так как вы не может изменить длину num.

Вы потребность выделить новый массив, который означает, что необходимость возвращения новый массив:

public static int[] method(int[] num, int index, int addnum) 
       ^^^^^ 

, а затем вызвать метод как это:

myArr = method(myArr, 3, 35); 
+1

Используемый метод имеет тип 'void' -won't новый выделенный массив будет отброшен? – amit

0

Ну, вы не можете, если в вашем массиве нет «лишнего пространства», а затем вы можете сдвинуть все элементы [начиная с index] с одного элемента вправо и добавить 35 [num] в t он соответствующее место.
[на самом деле происходит то, что последний элемент отбрасывается].

Однако - лучшее решение, вероятно, будет использовать ArrayList, и использовать метод myArrayList.add(index,element)

0

Поскольку это очень близко напоминает домашнюю работу, что вы должны понимать, что вы не можете динамически увеличивать размер массива. Таким образом, в вашей функции:

public static void(int[] num, int index, int addnum) 
{ 
     int[] temp = new int[num.length *2]; 
     for(int i = 0; i < index; i++) 
      copy num[i] into temp[i] 
     insert addnum into temp[index] 
     fill temp with remaining num values 
} 

Этот псевдокод выше должен вас начать.

0

Что вы ищете, это insertion sort.

Это классная работа, поэтому вам нужно выяснить правильный код.

0

Очень грубо говоря, вы хотите сделать что-то вроде этого:

public static void(int[] num, int index, int addnum) 
{  
    // initialize new array with size of current array plus room for new element 
    int[] newArray = new int[num.length + 1]; 

    // loop until we reach point of insertion of new element 
    // copy the value from the same position in old array over to 
    // same position in new array 
    for(int i = 0; i < index; i++) 
    { 
     newArray[i] = num[i]; 
    } 
    i = i + 1; // move to position to insert new value 

    newArray[i] = addnum; // insert the value 

    // loop until you reach the length of the old array 
    while(i < num.length) 
    { 
     newArray[i] = num[i-1]; 
    } 

    // finally copy last value over 
    newArray[i + 1] = num[i]; 
} 
+0

кто, ваш цикл while кажется длинным. – christophe31

5

Как это то, что вы должны выполнить сами, я буду только обеспечить способ его реализации, а не код:

Если вы должны установить номер в позиции index, вы бы перезаписали значение, которое было там ранее. Так что вам нужно сделать, это переместить каждый элемент на одну позицию к концу массива, начиная с index: num[x] становится num[x+1] и т.д.

Вы обнаружите, что вам нужно сделать это в обратном порядке, в противном случае вы будете заполнять ваш массив со значением в num[index].

В ходе этого процесса вам нужно будет решить, что делать с последней записью массива (num[num.length - 1]):

  • Вы можете просто переписать его, отбрасывая значение
  • Вы можете вернуть его из функция
  • Вы могли бы бросить исключение, если она отлична от нуля
  • Вы можете создать новый массив, который является 1 запись больше, чем текущий массив вместо того, чтобы сохранить все значения
  • и т.д.

После этого вы дублировали num[index]: значение присутствует в num[index+1], тоже, как вы переместили его.

Теперь можно записать новое значение в нужное положение без переопределения существующего значения.

EDIT

У вас есть несколько ошибок в коде:

  • You прибавкаk, нужно, чтобы декремента его (k--, не k++)
  • Вы изменить k снова в вашем тесте цикла: он обновляется дважды в каждом цикле
  • Если вы начинаете с k = num.length, вы будете пытаться написать на num[num.length + 1], что не возможно
0

Как насчет этого?

public class test { 
public static void main(String[] arg) throws IOException 
{ 
int[] myarray={1,2,3,5,6};//4 is missing we are going to add 4 
int[] temp_myarray=myarray;//take a temp array 
myarray=addElement(myarray,0);//increase length of myarray and add any value(I take 0) to the end 
for(int i=0;i<myarray.length;i++) 
{ if(i==3) //becaues I want to add the value 4 in 4th place 
     myarray[i]=4; 
    else if(i>3) 
     myarray[i]=temp_myarray[i-1]; 
    else 
     myarray[i]=temp_myarray[i]; 
} 
for(int i=0;i<myarray.length;i++) 
    System.out.print(myarray[i]);//Print new array 
} 

static int[] addElement(int[] arr, int elem) { 
    arr = Arrays.copyOf(arr, arr.length + 1); 
    arr[arr.length - 1] = elem; 
    return arr; 
} 
} 
Смежные вопросы