IT story

목록에서 정수를 올바르게 제거

hot-time 2020. 5. 12. 08:00
반응형

목록에서 정수를 올바르게 제거


내가 방금 만난 좋은 함정이 있습니다. 정수 목록을 고려하십시오.

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

당신이 실행할 때 무슨 일이 일어나는지에 대한 교육받은 추측 list.remove(1)? 무엇에 대해 list.remove(new Integer(1))? 이로 인해 일부 버그가 발생할 수 있습니다.

정수 목록을 다룰 때 remove(int index)주어진 색인 remove(Object o)에서 요소를 제거하는 요소와 참조로 요소를 제거하는 을 구별하는 올바른 방법은 무엇입니까 ?


여기서 고려해야 할 요점은 @Nikita가 언급 한 것입니다 . 정확한 매개 변수 일치는 자동 복싱보다 우선합니다.


Java는 항상 귀하의 주장에 가장 적합한 방법을 호출합니다. 자동 복싱 및 암시 적 업 캐스팅은 캐스팅 / 자동 복싱없이 호출 할 수있는 방법이없는 경우에만 수행됩니다.

List 인터페이스는 두 가지 remove 메소드를 지정합니다 (인수 이름 지정에 유의하십시오).

  • remove(Object o)
  • remove(int index)

list.remove(1), 위치 1에서 오브젝트를 remove(new Integer(1))제거하고이 목록에서 지정된 요소가 처음 나타나는 것을 제거합니다.


캐스팅을 사용할 수 있습니다

list.remove((int) n);

list.remove((Integer) n);

n이 int 또는 Integer인지 여부는 중요하지 않습니다. 메소드는 항상 예상 한 것을 호출합니다.

사용 (Integer) n또는 것이 Integer.valueOf(n)보다 효율적입니다 new Integer(n)나중에 항상 객체를 생성하는 반면 처음 두가, 정수 캐시를 사용할 수있다.


나는 '적절한'방법에 대해 모르지만 제안한 방식은 잘 작동합니다.

list.remove(int_parameter);

주어진 위치에서 요소를 제거하고

list.remove(Integer_parameter);

주어진 객체를 목록에서 제거합니다.

VM은 처음에 정확히 동일한 매개 변수 유형으로 선언 된 메서드를 찾은 다음 오토 박스를 시도하기 때문입니다.


list.remove(4)와 정확히 일치 list.remove(int index)하므로 호출됩니다. 전화를 걸 list.remove(Object)려면 다음을 수행하십시오 list.remove((Integer)4)..


list.remove (1)을 실행할 때 어떤 일이 발생하는지에 대한 교육 된 추측이 있습니까? list.remove (new Integer (1))는 어떻습니까?

추측 할 필요가 없습니다. 첫 번째 경우가 List.remove(int)호출되고 위치의 요소 1가 제거됩니다. 두 번째 경우는 List.remove(Integer)호출되고 값이 같은 요소는 Integer(1)제거됩니다. 두 경우 모두 Java 컴파일러는 가장 일치하는 과부하를 선택합니다.

예, 여기에는 혼동 (및 버그)이있을 수 있지만 매우 드문 경우입니다.

List.remove메소드가 Java 1.2에서 정의 되었을 때, 과부하는 모호하지 않았습니다. 이 문제는 Java 1.5에서 제네릭과 오토 박싱을 도입 한 경우에만 발생했습니다. 후시로, 제거 방법 중 하나에 다른 이름을 부여하면 더 좋을 것입니다. 그러나 지금 너무 늦었습니다.


VM이 올바른 작업을 수행하지 않더라도 remove(java.lang.Object)임의의 개체에서 작동 하는 사실을 사용하여 올바른 동작을 보장 할 수 있습니다 .

myList.remove(new Object() {
  @Override
  public boolean equals(Object other) {
    int k = ((Integer) other).intValue();
    return k == 1;
  }
}

#decitrig에서 제안한대로 첫 번째로 허용되는 답변은 다음과 같습니다.

list.remove(Integer.valueOf(intereger_parameter));

이것은 나를 도왔다. 귀하의 의견에 다시 #decitrig 감사합니다. 어떤 사람에게는 도움이 될 수 있습니다.


여기 트릭이 있습니다.

여기 두 가지 예를 들어 보자.

public class ArrayListExample {

public static void main(String[] args) {
    Collection<Integer> collection = new ArrayList<>();
    List<Integer> arrayList = new ArrayList<>();

    collection.add(1);
    collection.add(2);
    collection.add(3);
    collection.add(null);
    collection.add(4);
    collection.add(null);
    System.out.println("Collection" + collection);

    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(null);
    arrayList.add(4);
    arrayList.add(null);
    System.out.println("ArrayList" + arrayList);

    collection.remove(3);
    arrayList.remove(3);
    System.out.println("");
    System.out.println("After Removal of '3' :");
    System.out.println("Collection" + collection);
    System.out.println("ArrayList" + arrayList);

    collection.remove(null);
    arrayList.remove(null);
    System.out.println("");
    System.out.println("After Removal of 'null': ");
    System.out.println("Collection" + collection);
    System.out.println("ArrayList" + arrayList);

  }

}

이제 출력을 보자.

Collection[1, 2, 3, null, 4, null]
ArrayList[1, 2, 3, null, 4, null]

After Removal of '3' :
Collection[1, 2, null, 4, null]
ArrayList[1, 2, 3, 4, null]

After Removal of 'null': 
Collection[1, 2, 4, null]
ArrayList[1, 2, 3, 4]

이제 출력을 분석해 봅시다 :

  1. When 3 is removed from the collection it calls the remove() method of the collection which takes Object o as parameter. Hence it removes the object 3. But in arrayList object it is overridden by index 3 and hence the 4th element is removed.

  2. By the same logic of Object removal null is removed in both cases in the second output.

So to remove the number 3 which is an object we will explicitly need to pass 3 as an object.

And that can be done by casting or wrapping using the wrapper class Integer.

Eg:

Integer removeIndex = Integer.valueOf("3");
collection.remove(removeIndex);

참고URL : https://stackoverflow.com/questions/4534146/properly-removing-an-integer-from-a-listinteger

반응형