web-gelistirme-sc.com

Dizi ve kaydırma dizinlerine bir öğe nasıl eklenir?

Konum ve değeri belirten Array'a bir eleman eklemem gerekiyor .. __ Örneğin, Array var

int []a = {1, 2, 3, 4, 5, 6};

addPos(int 4, int 87) uygulandıktan sonra

int []a = {1, 2, 3, 4, 87, 5};

Burada Array dizininin bir kayması olması gerektiğini biliyorum, ancak kodun nasıl uygulanacağını görmüyorum.

14
devger

Bu hile yapmak gerekir:

public static int[] addPos(int[] a, int pos, int num) {
    int[] result = new int[a.length];
    for(int i = 0; i < pos; i++)
        result[i] = a[i];
    result[pos] = num;
    for(int i = pos + 1; i < a.length; i++)
        result[i] = a[i - 1];
    return result;
}

a orijinal dizi ise, pos yerleştirme konumu ve num eklenecek sayıdır.

14
jrad

Bunu yapmanın en basit yolu bir ArrayList<Integer> kullanmak ve add(int, T) yöntemini kullanmaktır.

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);

// Now, we will insert the number
list.add(4, 87);
8

Yeni bir dizi yapmalı, önek ve soneki kopyalamak için System.arraycopy kullanmalı ve o yuvayı yeni değere ayarlamalısınız.

7
Marko Topolnik

Jrad çözümü iyi ama dizi kopya kullanmaması hoşuma gitmiyor. Dahili olarak System.arraycopy () yerel bir arama yapar, böylece daha hızlı sonuç alırsınız. 

public static int[] addPos(int[] a, int index, int num) {
    int[] result = new int[a.length];
    System.arraycopy(a, 0, result, 0, index);
    System.arraycopy(a, index, result, index + 1, a.length - index - 1);
    result[index] = num;
    return result;
}
5
user1121883

Ödev kokuyorum, yani bir ArrayList'e izin verilmeyecek (?) 

"Dizin kaydırma" için bir yol aramak yerine, belki sadece yeni bir dizi oluşturun:

int[] b = new int[a.length +1];

Sonra

  1. kopya dizinleri form dizisi a sıfırdan yukarı konuma sayma
  2. ...
  3. ...

// edit: elbette kopyala dizin değerleri değil, indeksler

4
pafau k.

commons 'a bakın. ArrayCopy () kullanır, ancak daha hoş sözdizimine sahiptir. Öğe öge koduna cevap verenlere: Bu ödev değilse, bu önemsizdir ve ilginç cevap yeniden kullanımı teşvik eden cevaptır. Listeleri önerenler için: Muhtemelen okuyucular da bunu biliyor ve performans konularına değinmek gerekiyor.

2
zakmck

Bir şey kaçırmıyorsam, soru dizi boyutunu artırmakla ilgili değil. Örnekte dizi boyutu aynı kalıyor. (Biraz kayma gibi.) Bu durumda, yeni bir dizi oluşturmak veya kopyalamak için hiçbir neden yoktur. Bu hile yapmak gerekir:

static void addPos(int[] array, int pos, int value) {
    // initially set to value parameter so the first iteration, the value is replaced by it
    int prevValue = value;

    // Shift all elements to the right, starting at pos
    for (int i = pos; i < array.length; i++) {
        int tmp = prevValue;
        prevValue = array[i];
        array[i] = tmp;
    }
}
int []a = {1, 2, 3, 4, 5, 6};
addPos(a, 4, 87);
// output: {1, 2, 3, 4, 87, 5}
2
Ivar

İşte bunu yapan bir yarı-oneliner:

String[] prependedArray = new ArrayList<String>() {
  {
    add("newElement");
    addAll(Arrays.asList(originalArray));
  }
}.toArray(new String[0]);
2
Tomasz

Tekerleği yeniden icat etmek yerine Apache Commons kullanmayı tercih ederseniz, mevcut yaklaşım şudur:

a = ArrayUtils.insert(4, a, 87);

ArrayUtils.add (...) idi, ancak bir süre önce kullanımdan kaldırıldı. Daha fazla bilgi burada: 1

1
Fran Marzoa

org.Apache.commons.lang3.ArrayUtils#add(T[], int, T), en yeni commons lang3'te kullanımdan kaldırılmıştır, bunun yerine org.Apache.commons.lang3.ArrayUtils#insert(int, T[], T...) işlevini kullanabilirsiniz.

Kullanımdan kaldırılan bu yöntem insert (int, T [], T ...) ile değiştirilmiştir ve gelecekteki bir sürümde kaldırılabilir. Lütfen boş giriş dizilerinin işlenmesinin yeni yöntemde farklı olduğuna dikkat edin: boş bir diziye X eklenmesi boş değil X ile sonuçlanır

Basit kod:

    Assert.assertArrayEquals
            (org.Apache.commons.lang3.ArrayUtils.insert
            (4, new int[]{1, 2, 3, 4, 5, 6}, 87), new int[]{1, 2, 3, 4, 87, 5, 6});
1
aristotll

System.arraycopy daha performanslıdır ancak endeks hesaplamaları nedeniyle haklı olmak zordur. Performans gereksinimleriniz yoksa, jrad answer ya da ArrayList ile daha iyi sopa.

public static int[] insert(
    int[] array, int elementToInsert, int index) {
  int[] result = new int[array.length + 1];
  // copies first part of the array from the start up until the index
  System.arraycopy(
      array /* src */,
      0 /* srcPos */,
      result /* dest */,
      0 /* destPos */,
      index /* length */);
  // copies second part from the index up until the end shifting by 1 to the right
  System.arraycopy(
      array /* src */,
      index /* srcPos */,
      result /* dest */,
      index + 1 /* destPos */,
      array.length - index /* length */);
  result[index] = elementToInsert;
  return result;
}

Ve beklendiği gibi çalışıp çalışmadığını kontrol etmek için JUnit4 testi.

@Test
public void shouldInsertCorrectly() {
  Assert.assertArrayEquals(
      new int[]{1, 2, 3}, insert(new int[]{1, 3}, 2, 1));
  Assert.assertArrayEquals(
      new int[]{1}, insert(new int[]{}, 1, 0));
  Assert.assertArrayEquals(
      new int[]{1, 2, 3}, insert(new int[]{2, 3}, 1, 0));
  Assert.assertArrayEquals(
      new int[]{1, 2, 3}, insert(new int[]{1, 2}, 3, 2));
}
0
TohaSt
public class HelloWorld{

     public static void main(String[] args){
        int[] LA = {1,2,4,5};
        int k = 2;
        int item = 3;
        int j = LA.length;
        int[] LA_NEW = new int[LA.length+1];


       while(j >k){
            LA_NEW[j] = LA[j-1];
            j = j-1;
        }
        LA_NEW[k] = item;
        for(int i = 0;i<k;i++){
            LA_NEW[i] = LA[i];
        }
        for(int i : LA_NEW){
            System.out.println(i);
        }
     }
}
0
Chiya

Aşağıdaki kod elemanı belirtilen konuma yerleştirir ve mevcut elemanları yeni elemanların yanına taşımak için kaydırır.

public class InsertNumInArray {

public static void main(String[] args) {
    int[] inputArray = new int[] { 10, 20, 30, 40 };
    int inputArraylength = inputArray.length;
    int tempArrayLength = inputArraylength + 1;
    int num = 50, position = 2;
    int[] tempArray = new int[tempArrayLength];

    for (int i = 0; i < tempArrayLength; i++) {
        if (i != position && i < position)
            tempArray[i] = inputArray[i];
        else if (i == position)
            tempArray[i] = num;
        else
            tempArray[i] = inputArray[i-1];
    }

      inputArray = tempArray;

    for (int number : inputArray) {
        System.out.println("Number is: " + number);
    }
}
}
0
PAQuality101

Bunu dene 

public static int [] insertArry (int inputArray[], int index, int value){
    for(int i=0; i< inputArray.length-1; i++) {

        if (i == index){

            for (int j = inputArray.length-1; j >= index; j-- ){
                inputArray[j]= inputArray[j-1];
            }

            inputArray[index]=value;
        }

    }
    return inputArray;
}
0
Akash
int[] b = new int[a.length +1];
System.arraycopy(a,0,b,0,4); 
//System.arraycopy(srcArray, srcPosition, destnArray, destnPosition, length)
b[4]=87;
System.arraycopy(a,4,b,5,2);

b dizisi {1, 2, 3, 4, 87, 5,6} olarak yaratılır;

0
Praveen