배열에서 첫 번째 요소를 제거하는 가장 좋은 방법은 무엇입니까?


87

문자열 배열 ( String[])이 있고 첫 번째 항목을 제거해야합니다. 어떻게 효율적으로 할 수 있습니까?



4
속임수는 아닙니다. 이전 질문은 값으로 항목을 제거하는 것입니다. 이것은 인덱스로 항목을 제거하는 것입니다.
james.garriss 2013

답변:


158

Java의 배열 크기는 변경할 수 없습니다. 따라서 기술적으로 배열에서 요소를 제거 할 수 없습니다.

배열에서 요소 제거를 시뮬레이션하는 한 가지 방법은 더 작은 새 배열을 만든 다음 원래 배열의 모든 요소를 ​​더 작은 새 배열로 복사하는 것입니다.

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

그러나 위의 방법을 제안하지 않습니다. 당신은 정말로 List<String>. 목록을 사용하면 색인에서 항목을 추가하고 제거 할 수 있습니다. 다음과 유사합니다.

List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item

34
an의 첫 번째 요소를 제거하는 ArrayList것은 O (n)입니다.
Matthew Flaschen

1
배열 및 목록의 경우 @Matt. 그러나 코드는 목록에 비해 훨씬 쉽습니다.
jjnguy

16
배열 및의 ArrayList경우 LinkedList.
Matthew Flaschen

4
의 위에) ? 음 .. C 배열에서? 첫 번째 요소를 제거하려면 포인터를
올리면됩니다.

3
나 같은 안드로이드 자바를 사용하는 사람들을 위해, Arrays.copyOfRange()API9에 대한 +입니다
Sdghasemi

15

가장 간단한 방법은 아마도 다음과 같습니다. 기본적으로 한 요소 더 작은 새 배열을 생성 한 다음 유지하려는 요소를 올바른 위치에 복사해야합니다.

int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);

이러한 종류의 작업을 자주 수행하는 경우 실제로 다른 종류의 데이터 구조 (예 : 연결 목록)를 사용해야한다는 신호일 수 있습니다. 매번 새로운 배열을 생성하는 것은 O (n) 작업이며 배열이 크면 비용이 많이들 수 있습니다. 연결 목록은 첫 번째 요소의 O (1) 제거를 제공합니다.

다른 방법은 첫 번째 항목을 전혀 제거하지 않고 사용중인 첫 번째 인덱스를 가리키는 정수를 증가시키는 것입니다. 어레이 사용자는이 오프셋을 고려해야하지만 이는 효율적인 접근 방법이 될 수 있습니다. Java String 클래스는 실제로 하위 문자열을 만들 때 내부적으로이 메서드를 사용합니다.


4
이것은 기술적으로 가장 쉬운 방법이 아닙니다. Arrays.copyOfRange()이다.
jjnguy

4
그는 Java6을 사용하고 있기 때문에, 그는 더 컴팩트 Arrays.copyOfRange 사용할 수 있습니다
틸로

1
@Justin-확실하지만 Java 1.6 이상을 대상으로하는 경우에만
mikera

1
진실. 항상 적용 가능한 것은 아닙니다.
jjnguy

6
질문 제목을 통해 OP Java 1.6 이상에 대한 답변에 관심 있음을 분명히 알 수 있습니다.
Stephen C

5

빨리는 말할 것도없고 전혀 할 수 없습니다. Java의 배열은 고정 된 크기입니다. 다음 두 가지를 수행 할 수 있습니다.

  1. 모든 요소를 ​​한 위로 이동 한 다음 마지막 요소를 null로 설정합니다.
  2. 새 배열을 만든 다음 복사합니다.

System.arraycopy둘 중 하나에 사용할 수 있습니다 . 둘 다 O (n)입니다. 하나를 제외한 모든 요소를 ​​복사하기 때문입니다.

첫 번째 요소를 자주 제거하려면 LinkedList대신 사용 을 고려하십시오 . 당신은 사용할 수 있습니다 LinkedList.remove으로부터 인 Queue편의를 위해 인터페이스를 제공합니다. 함께 LinkedList첫 번째 요소를 제거하여, O (1)이다. 실제로 ListIterator해당 위치에 가면 요소를 제거하는 것은 O (1) 입니다. 그러나 인덱스로 임의의 요소에 액세스하는 것은 O (n)입니다.


3

배열의 첫 번째 "라이브"요소의 인덱스를 유지합니다. 첫 번째 요소를 제거 (제거하는 척)하면 O(1)시간 복잡성 작업이됩니다.


0

요약하자면 빠른 연결 목록 방법은 다음과 같습니다.

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);

-10

다른 추악한 방법 :

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");

2
제발, 충분한 평판을 가진 사람이이 답변에 반대표를 던지십시오-그것이 말하는 그대로입니다-추악합니다! 무례 할 의도는 없지만 코딩 가능성을 위해 이런 종류의 게시물을 올리지 마십시오!
Hack5

이미 배열을 사용하는 경우, Arrays.copyOfRange 사용하는 것이 더 좋을 것이다
Bishal 가우 탐

그는 최선의 방법을 요구했습니다 .
Sapphire_Brick

그것을 삭제하고 얼마나 많은 평판을 얻을 수 있는지 확인하십시오.
Sapphire_Brick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.