development

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

big-blog 2020. 6. 29. 07:29
반응형

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


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

빈 배열 목록이 있습니다.

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

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

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

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


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

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

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

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


객체 배열을 사용하여 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]


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

Object[] list = new Object[10];

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

크기와 추가하려는 요소 사이에 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


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

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


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

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

arraylist.add(position, object);

@Maethortje 

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

while trying to add an element at specified position you got IndexOutOfBound , so the list should have some elements at their position.

Please try following

/*
  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

*/

How about this little while loop as a solution?

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)

This is a possible solution:

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

I think the solution from medopal is what you are looking for.

But just another alternative solution is to use a HashMap and use the key (Integer) to store positions.

This way you won't need to populate it with nulls etc initially, just stick the position and the object in the map as you go along. You can write a couple of lines at the end to convert it to a List if you need it that way.


Suppose you want to add an item at a position, then the list size must be more than the position.

add(2, item): this syntax means, move the old item at position 2 to next index and add the item at 2nd position.

If there is no item in 2nd position, then this will not work, It'll throw an exception.

That means if you want to add something in position 2,

your list size must be at least (2 + 1) =3, so the items are available at 0,1,2 Position.

in that way it is ensured that the position 2 is accessed safely and there would be no exception.


If you are using the Android flavor of Java, might I suggest using a SparseArray. It's a more memory efficient mapping of integers to objects and easier to iterate over than a Map


Bit late but hopefully can still be useful to someone.

2 steps to adding items to a specific position in an ArrayList

  1. add null items to a specific index in an ArrayList
  2. Then set the positions as and when required.

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

This way you don't have redundant items in the ArrayList i.e. if you were to add items such as,

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

This would not overwrite existing items in the position merely, shifting existing ones to the right by one - so you have an ArrayList with twice as many indicies.


You should set instead of add to replace existing value at index.

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

List will contain [object1,object2]

참고URL : https://stackoverflow.com/questions/7384908/add-object-to-arraylist-at-specified-index

반응형