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

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



답변

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


답변

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

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

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

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


답변

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

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

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

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


답변

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


답변

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

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


답변

다른 추악한 방법 :

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


답변