지정된 인덱스에서 ArrayList에 객체 추가


142

나는 그것이 매우 간단한 질문이라고 생각하지만, 이것을 올바르게 수행하는 방법을 알 수는 없습니다.

빈 배열 목록이 있습니다.

ArrayList<object> list = new ArrayList<object>();

추가하려는 객체가 있으며 각 객체는 특정 위치에 있어야합니다. 그러나 가능한 각 순서대로 추가 할 수 있어야합니다. 이것을 시도하면 작동하지 않으며 IndexOutOfBoundsException:

list.add(1, object1)
list.add(3, object3)
list.add(2, object2)

내가 시도하면 충전입니다 ArrayList함께 null다음 위의 일입니다. 작동하지만 끔찍한 해결책이라고 생각합니다. 다른 방법이 있습니까?


7
목록이 비어 있고 존재하지 않는 목록 위치에 액세스 할 수 없기 때문에 IndexOutOfBoundsException이 발생합니다.
Vic

1
null 객체로 목록을 채우지 않고 해당 위치를 만드는 방법이 있습니까? 나에게 그것은 정말 이상한 해결책 인 것 같습니다.
J. Maes

1
나는 그렇게 생각하지 않습니다 ... 임의의 순서로 객체를 추가 해야하는 경우 다른 방법을 찾아야합니다. 예를 들어 일반적인 배열 : 'Object []'를 사용하면 채우지 않아도됩니다. 그냥 초기화하십시오
Vic

1
@ Maethortje 그것은 정말 이상한 문제가 아닙니다. 희소 한 목록을 참조 하십시오. reference.wolfram.com/mathematica/tutorial/… 좋은 기사 인 것 같습니다. Java에서는 인덱스가 키인 맵이 가장 쉬운 방법 일 수 있습니다.
불가능한 변수

2
@Pan 당신이 크기를 선언하더라도 .. 그것은 단지 목록을 초기화하지 않고, 얼마나 많은 공간을 메모리에 예약하고 싶은지를 선언한다. 내가 본 것처럼, 목록은 다음 요소. 두 번째 빈 (또는 null)이있을 때 세 번째 위치에 요소를 추가하려고하면 세 번째 요소임을 알 수있는 포인터가 없습니다 .. 1-> 2-> 3은 괜찮지 만 1- > *-> 3 여기에 문제가 있습니다 ...
Vic

답변:


209

다음과 같이 할 수 있습니다 :

list.add(1, object1)
list.add(2, object3)
list.add(2, object2)

object2를 위치 2에 추가하면 object3이 위치 3으로 이동합니다.

항상 object3을 position3에 배치하려면 위치를 키로, 객체를 값으로 사용하여 HashMap을 사용하는 것이 좋습니다.


3
해시 맵은 실제로이 문제를 해결할 수있을 것입니다. 2 번 위치에 물체가 없을 때 3 번 위치에 무언가를 추가 할 수없는 것처럼 보이기 때문에 그 중 하나를 선택하겠습니다.
J. Maes

짧지 만 대부분의 답변. 다른 사람은 단지 잘못된 궤도에
의 Shabbir Dhangot

건설적인 논리!
Arsal Imam

31

객체 배열을 사용하여 ArrayList-로 변환 할 수 있습니다.

Object[] array= new Object[10];
array[0]="1";
array[3]= "3";
array[2]="2";
array[7]="7";

List<Object> list= Arrays.asList(array);

ArrayList는-[1, null, 2, 3, null, null, null, 7, null, null]


2
한 가지 단점은 크기를 미리 알아야한다는 것입니다.
Daniel Hári

17

그렇다면 일반 Array 사용을 고려하지 않는 것이 좋습니다. 용량을 초기화하고 원하는 인덱스에 객체를 넣으십시오.

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;

용량을 초기화하지만 'ArrayList'의 크기는 초기화하지 않습니다. 크기는 요소의 수로 정의되며 색인이> 크기 일 때 예외가 발생합니다 ...
Vic

@ 빅, 나는 처음에 질문을 잘못 읽었지만 팁을 주셔서 감사합니다.
medopal

용량을 10으로 초기화했지만 객체를 추가 할 때 여전히 IndexOutOfBoundsExceptopn을 얻습니다. ensureCapacity로 용량을 변경하는 것과 동일합니다. 작동하는 것은 현재 null로 채워지는 것입니다.
J. Maes

@Maethortje "크기"와 "용량"의 차이를 찾으십시오 ... 예외는 인덱스가> 용량이 아닌> 크기 일 때입니다 .....
Vic

사람들이 언급했듯이 목록 3의 크기는 여전히 1 인 동안 인덱스 3에 객체를 추가하고 있습니다. 불가능합니다. 이 인덱스가 목록의 경계 안에있는 한 특정 인덱스에 추가 할 수 있습니다 (예 : 목록에 3 개의 개체가있는 경우 인덱스 100에 개체를 추가 할 수 없습니다.
medopal

14

크기와 추가하려는 요소 사이에 null을 삽입하기 위해 ArrayList를 재정의 할 수도 있습니다.

import java.util.ArrayList;


public class ArrayListAnySize<E> extends ArrayList<E>{
    @Override
    public void add(int index, E element){
        if(index >= 0 && index <= size()){
            super.add(index, element);
            return;
        }
        int insertNulls = index - size();
        for(int i = 0; i < insertNulls; i++){
            super.add(null);
        }
        super.add(element);
    }
}

그런 다음 ArrayList의 어느 시점 에나 추가 할 수 있습니다. 예를 들어이 주요 방법은 다음과 같습니다.

public static void main(String[] args){
    ArrayListAnySize<String> a = new ArrayListAnySize<>();
    a.add("zero");
    a.add("one");
    a.add("two");
    a.add(5,"five");
    for(int i = 0; i < a.size(); i++){
        System.out.println(i+": "+a.get(i));
    }
}   

콘솔에서이 결과를 얻습니다.

0 : 영

1 : 하나

2 : 두

3 : null

4 : 널

5 : 5


9

나는 당신의 관심을 끌기 ArrayList.add문서 가 발생 말한다 IndexOutOfBoundsException- 인덱스가 범위 외의 경우 ( index < 0 || index > size())

size()전화하기 전에 목록을 확인하십시오list.add(1, object1)


당신은 맞습니다 @Hemal, @Maethortje 목록에 요소를 추가하기 전에 왜 목록의 크기를 확인하지 않습니까? 추가하려는 위치가 목록의 크기보다 작은 지 확인하십시오. 그렇지 않은 경우 정상적인 작업을 수행 할 수 있습니다list.add("element");
Rakesh

1
내가 이해하는 것처럼 "문제"는 위치 2에 요소가 없더라도 위치 3에 요소를 추가하는 것입니다.
Vic

희소 목록 인 @Vis-질문에 대한 내 의견을 참조하십시오.
불가능한 변수

5

빈 인덱스를 null로 채워야합니다.

while (arraylist.size() < position)
{
     arraylist.add(null);
}

arraylist.add(position, object);

2
@Maethortje 

The problem here is java creates an empty list when you called new ArrayList and 

지정된 위치에 요소를 추가하려고하면 IndexOutOfBound가 생겼으므로 목록에 해당 위치에 일부 요소가 있어야합니다.

다음을 시도하십시오

/*
  Add an element to specified index of Java ArrayList Example
  This Java Example shows how to add an element at specified index of java
  ArrayList object using add method.
*/

import java.util.ArrayList;

public class AddElementToSpecifiedIndexArrayListExample {

  public static void main(String[] args) {
    //create an ArrayList object
    ArrayList arrayList = new ArrayList();

    //Add elements to Arraylist
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");

    /*
      To add an element at the specified index of ArrayList use
      void add(int index, Object obj) method.
      This method inserts the specified element at the specified index in the
      ArrayList.  
    */
    arrayList.add(1,"INSERTED ELEMENT");

    /*
      Please note that add method DOES NOT overwrites the element previously
      at the specified index in the list. It shifts the elements to right side
      and increasing the list size by 1.
    */

    System.out.println("ArrayList contains...");
    //display elements of ArrayList
    for(int index=0; index < arrayList.size(); index++)
      System.out.println(arrayList.get(index));

  }
}

/*
Output would be
ArrayList contains...
1
INSERTED ELEMENT
2
3

*/

내 오류를 일으키는 문제를 이해합니다. 해당 위치에 객체를 추가하기 전에 후속 위치에 객체를 추가 해야하는 것 같습니다. 내가 추가하는 순간, 내가 추가하려는 모든 객체를 폐기하지는 않습니다. 그렇다면 null 객체를 추가하는 것이 올바른 해결책이라고 생각하십니까?
J. Maes

@Maethortje 그것은 단지 해킹으로, 이렇게하는 것이 매우 공정하지 않을 것입니다 :)
Sankalp

첫 번째 단락에서 코드 샘플 따옴표를 제거해야합니다.
Jalal Sordo

2

while솔루션 으로이 작은 루프는 어떻습니까?

private ArrayList<Object> list = new ArrayList<Object>();

private void addObject(int i, Object object) {
    while(list.size() < i) {
        list.add(list.size(), null);
    }
    list.add(i, object);
}
....

addObject(1, object1)
addObject(3, object3)
addObject(2, object2)

2

이것은 가능한 해결책입니다.

list.add(list.size(), new Object());

1

나는 medopal의 해결책이 당신이 찾고있는 것이라고 생각합니다.

그러나 또 다른 대안은 HashMap을 사용하고 키 (정수)를 사용하여 위치를 저장하는 것입니다.

이렇게하면 처음에 null 등으로 채울 필요가 없으며 진행하면서 맵의 위치와 객체를 고정하십시오. 마지막에 두 줄을 작성하여 필요한 경우 목록으로 변환 할 수 있습니다.


키로 주문한 이후 TreeMap이 더 좋지 않습니까?
Daniel Hári

1

위치에 항목을 추가하려는 경우 목록 크기가 위치보다 커야합니다.

add(2, item):이 구문은 위치 2의 이전 항목을 다음 색인으로 이동하고 항목을 두 번째 위치에 추가 함을 의미합니다.

두 번째 위치에 항목이 없으면 작동하지 않습니다. 예외가 발생합니다.

즉, 무언가 를 추가 하고 싶다면position 2,

귀하의 목록 크기는 최소한이어야 (2 + 1) =3,항목이에서 사용할 수 있도록0,1,2 Position.

이러한 방식으로 위치 2에 안전하게 액세스 할 수 있으며 예외는 없습니다.


2
나는 당신의 대답을 알았을 때 그냥 지나가고 있습니다 ... 실제로, 색인은 우리가 새 항목을 삽입하는 순간 목록의 실제 길이보다 작 거나 같아야 합니다 . 예 : 목록 크기는 2 : 인덱스 2에 추가하면 효과가 있습니다. 인덱스 3을 추가하면 예외가 발생합니다. (그것은 테스트되었습니다)
Houssem Chlegou

0

Java의 Android 버전을 사용하는 경우 SparseArray를 사용하는 것이 좋습니다 . 정수를 객체에보다 메모리 효율적으로 매핑하고 맵보다 반복하기가 쉽습니다.


0

조금 늦었지만 희망은 여전히 ​​누군가에게 유용 할 수 있습니다.

항목을 특정 위치에 추가하는 2 단계 ArrayList

  1. add 의 특정 인덱스에 null 항목 ArrayList
  2. 그런 다음 set필요할 때 위치.

        list = new ArrayList();//Initialise the ArrayList
    for (Integer i = 0; i < mItems.size(); i++) {
        list.add(i, null); //"Add" all positions to null
    }
       // "Set" Items
        list.set(position, SomeObject);

이 방법으로 ArrayList예를 들어 다음과 같은 항목을 추가하려는 경우 중복 항목이 없습니다 .

list = new ArrayList(mItems.size());    
list.add(position, SomeObject);

이것은 위치의 기존 항목을 덮어 쓰지 않고 기존 항목을 오른쪽으로 하나씩 이동하므로 인덱스가 두 배 많은 ArrayList가 있습니다.


0

인덱스에서 기존 값을 바꾸려면 add 대신 설정해야합니다.

list.add(1, object1)
list.add(2, object3)
list.set(2, object2)

리스트는 [object1, object2]를 포함합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.