목록이나지도에서 요소를 가로 지르고 삭제하는 방법에는 여러 가지가 있으며 부적절하게 사용하면 문제가 발생합니다. 아래이 기사에서 배우자.
1. 목록 트래버스 중 요소를 삭제합니다
인덱스 첨자 트래버스를 사용하십시오
예 : 목록에서 2를 삭제합니다
public static void main (String [] args) {list <integer> list = new ArrayList <integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); for (int i = 0; i <list.size (); i ++) {if (2 == list.get (i)) {list.remove (i); } system.out.println (list.get (i)); } system.out.println ( "list =" + list.toString ()); }출력 결과 :
1234List = [1, 2, 3, 4]
질문:
결과는 단 하나의 2 만 삭제되었고 다른 2 개는 놓친 것으로 나타났습니다. 그 이유는 첫 번째 2를 삭제 한 후 세트의 요소 수가 1만큼 감소되고 후속 요소는 1 비트 씩 전진하여 두 번째 2가 누락됩니다.
루프 트래버스에 사용하는 방법
예:
public static void listiterator2 () {list <integer> list = new arraylist <integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); for (int value : list) {if (2 == value) {list.remove (value); } system.out.println (값); } system.out.println (값); } system.out.println ( "list =" + list.toString ()); }결과:
스레드 예외 "Main"12java.util.concurrentModificationException at java.util.arraylist $ ittr.checkforcomodification (unknown source) at java.util.arraylist $ ittr.next (unknown source) at test.listiterator.listiterator2 (listiterator.java:39) at at at at at test.listiterator.main (listiterator.java:10)
설명 :
JDK의 동시 변형 설명에 대한 설명 :
public class ConcurrentModificationException extends
runtimeexception이 예외는 메소드가 물체의 동시 수정을 감지하지만 그러한 수정을 허용하지 않으면 발생합니다.
예를 들어, 스레드가 컬렉션에 반복 될 때, 다른 선형 수정은 일반적으로 만들 수 없습니다. 일반적 으로이 경우 반복 결과는 불확실합니다. 이 동작이 감지되면 일부 반복자 구현 (JRE가 제공 한 모든 일반 수집 구현 포함) 에서이 예외를 던질 수 있습니다. 이 작업을 수행하는 반복기를 빠른 실패 반복기라고합니다. 반복자는 향후 임의의 불확실한 행동의 위험을 위험에 빠뜨리지 않으면 서 반복자가 매우 빠르게 실패하기 때문입니다.
참고 :이 예외가 항상 다른 스레드에 의해 객체가 동시에 수정되었음을 나타내는 것은 아닙니다. 단일 스레드가 객체의 계약을 위반하는 일련의 메소드 호출을 발행하면 객체 가이 예외를 던질 수 있습니다. 예를 들어, 스레드가 빠른 실패 반복기를 사용하여 컬렉션에서 반복 할 때 스레드가 컬렉션을 직접 수정하면 반복자 가이 예외를 던집니다.
참고 : 반복자의 빠른 고장 거동은 보장 될 수 없습니다. 일반적으로 동기가없는 동시 수정이 있는지 여부에 대한 어려운 보장이 불가능하기 때문입니다. 빠른 고장 작업은 ConcurrentModificationException 던지기 위해 최선을 다할 것입니다. 따라서 이러한 작업의 정확성을 향상시키기 위해이 예외에 의존하는 프로그램을 작성하는 것은 잘못입니다. 올바른 방법은 다음과 같습니다. ConcurrentModificationException 버그를 감지하기 위해서만 사용해야합니다.
Java의 각각에 대해 실제로 처리를 위해 반복기를 사용합니다. 반복자를 사용하면 반복자를 사용하는 동안 컬렉션을 삭제할 수 없습니다. 이로 인해 반복자가 ConcurrentModificationException 던지게됩니다.
올바른 방법
예:
public static void listiterator3 () {list <integer> list = new arraylist <integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); 반복자 <integer> it = list.iterator (); while (it.hasnext ()) {Integer value = it.next (); if (2 == value) {it.remove (); } system.out.println (값); } system.out.println (값); } system.out.println ( "list =" + list.toString ()); }결과:
12234List = [1, 3, 4]
2.지도 트래버스 중 요소를 삭제합니다
올바른 접근법의 예 :
public static void main (String [] args) {Hashmap <String, String> map = new Hashmap <String, String> (); map.put ( "1", "test1"); map.put ( "2", "test2"); map.put ( "3", "test3"); map.put ( "4", "test4"); // (Entry <String, String> entry : map.EntrySet ()) {System.Out.printf ( "키 : %s 값 : %s/r/n", enther.getKey (), enther.getValue ()) } // 요소 반복자 <map.entry <string, String >> it = map.entryset (). iterator (); while (it.hasnext ()) {map.entry <string, String> entry = it.next (); 문자열 key = Entry.getKey (); int k = integer.parseint (키); if (k%2 == 1) {System.out.printf ( "삭제 키 :%s 값 :%s/r/n", key, enther.getValue ()); it.remove (); }} // (Entry <String, String> entry : map.EntrySet ()) {System.out.printf ( "키 : %s 값 : %s/r/n", enther.getKey (), enther.getValue ()); }}결과:
키 : 1 값 : test1key : 2 값 : test2key : 3 값 : test3key : 4 값 : test4delete 키 : 1 값 : test1delete 키 : 3 값 : test3key : 2 값 : 4 값 : test4
알아채다
그러나 반복자의 remove() 방법에 대해주의를 기울여야 할 것들도 있습니다.
remove() iterator.next() .
remove() 메소드를 호출하기 전에 next() 메소드를 한 번 호출해야합니다.
JDK-API의 remove () 메소드에 대한 설명 :
void remove() 반복자가 반복자가 가리키는 컬렉션에서 반복자가 반환 한 마지막 요소를 제거합니다 (선택적 작동). 이 방법은 다음에 전화 당 한 번만 호출 할 수 있습니다. 반복 할 때이 메소드를 호출하는 것 외에 반복기가 수정되면 반복자의 동작은 모호합니다.
던지기 : UnsupportedOperationException 반복자가 remove 작업을 지원하지 않는 경우. IllegalStateException exception- next 메소드가 호출되지 않았거나 next 메소드를 마지막으로 호출 한 후에 remove 메소드가 호출 된 경우.
요약
위의 모든 것은 목록과지도의 횡단 동안 요소를 삭제하는 것입니다. 이 기사의 내용이 모든 사람의 연구 나 업무에 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.