2012-07-24 41 views
11

Tôi cần thêm phần tử vào Array chỉ định vị trí và giá trị. Ví dụ, tôi có mảngLàm thế nào để thêm một phần tử vào mảng và thay đổi chỉ mục?

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

sau addPos áp dụng (int 4, int 87) nó phải được

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

Tôi hiểu rằng đây phải là một sự thay đổi của chỉ số mảng, nhưng không xem cách triển khai mã trong mã.

+0

Bạn không thể thay đổi chỉ số cho mảng trong Java . Mảng là kích thước cố định. Tạo mảng mới với các giá trị bạn muốn và gán tham chiếu 'a' cho mảng mới. – kosa

+0

Bài tập về nhà? Nếu có, hãy gắn thẻ như vậy. –

+0

Quá muộn vì đã có câu trả lời đầy đủ. –

Trả lời

6

Cách đơn giản nhất để thực hiện việc này là sử dụng ArrayList<Integer> và sử dụng phương thức add(int, T).

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); 
+0

Tôi chỉ cần sử dụng Array. – devger

+1

Phương thức là 'add (int index, T element)', không phải 'insert'. –

+0

@danielkullmann: Đúng! Cảm ơn người đàn ông! Đã chỉnh sửa: D –

4

Tôi ngửi thấy bài tập ở nhà, vì vậy có thể là một ArrayList sẽ không được phép

Thay vì tìm kiếm một cách để "chỉ số thay đổi", có lẽ chỉ cần xây dựng một mảng mới (?):

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

Sau đó

  1. bản sao hình thức chỉ số mảng một đếm từ zero lên để chèn positio n
  2. ...
  3. ...

// chỉnh sửa: giá trị bản sao tất nhiên, không chỉ

7

Bạn phải tạo ra một mảng mới, sử dụng System.arraycopy để sao chép các tiền tố và hậu tố, và đặt một vị trí đó thành giá trị mới.

12

này nên làm như lừa:

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; 
} 

đâu a là mảng ban đầu, pos là vị trí của chèn, và num là số cần được chèn vào.

+10

'System.arraycopy' chắc chắn sẽ là một giải pháp đẹp hơn. –

+0

Thật vậy. Tôi không biết rằng được xây dựng trong. – jrad

+0

Cảm ơn Jack, đã giúp tôi. – devger

2

Đây là một bán oneliner nào đó:

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

Có một cái nhìn tại commons. Nó sử dụng arrayCopy(), nhưng có cú pháp đẹp hơn. Đối với những người trả lời bằng mã phần tử-by-element: nếu đây không phải là bài tập về nhà, điều đó là tầm thường và câu trả lời thú vị là câu trả lời khuyến khích tái sử dụng. Đối với những người đề xuất danh sách: có lẽ độc giả cũng biết về điều đó và các vấn đề hiệu suất cần được đề cập.

0

Hãy thử b mảng

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
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
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); 

này sẽ được tạo ra như là {1, 2, 3, 4, 87, 5,6};

0

System.arraycopy hoạt động hiệu quả hơn nhưng khó để có được quyền do tính toán chỉ mục. Tốt hơn dính với câu trả lời jrad hoặc ArrayList nếu bạn không có yêu cầu hiệu suất.

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; 
} 

Và kiểm tra JUnit4 để kiểm tra xem có hoạt động như mong đợi không.

@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)); 
} 
1

Giải pháp Jrad là tốt nhưng tôi không thích rằng anh ấy không sử dụng bản sao mảng. Nội bộ System.arraycopy() hiện một cuộc gọi bản địa, do đó bạn sẽ có được kết quả nhanh hơn.

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; 
} 
1

org.apache.commons.lang3.ArrayUtils#add(T[], int, T) bị phản đối ở mới nhất commons lang3, bạn có thể sử dụng org.apache.commons.lang3.ArrayUtils#insert(int, T[], T...) để thay thế.

Không chấp nhận phương pháp này đã được thay thế bằng chèn (int, T [], T ...) và có thể bị xóa trong bản phát hành trong tương lai. Xin lưu ý việc xử lý các mảng đầu vào rỗng khác ở chỗ phương pháp mới: chèn X vào một kết quả mảng null trong rỗng không X

Mẫu mã:

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}); 
Các vấn đề liên quan