n 개의 객체 의 배열이 주어 졌을 때, 이것이 strings 의 배열이고 다음과 같은 값을 가지고 있다고 가정 해 봅시다 .
foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";
배열에서 “a” 와 같은 모든 문자열 / 객체를 삭제 / 제거하려면 어떻게해야 합니까?
답변
[즉시 사용할 수있는 코드가 필요하면 내 “Edit3″(잘라 내기 후)로 스크롤하십시오. 나머지는 후세를위한 것입니다.]
Dustman의 아이디어 를 구체화하려면 :
List<String> list = new ArrayList<String>(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);
편집 : Arrays.asList
대신 사용하고 있습니다 Collections.singleton
: singleton은 하나의 항목으로 제한되지만 asList
접근 방식은 나중에 필터링 할 다른 문자열을 추가 할 수 있습니다.Arrays.asList("a", "b", "c")
.
Edit2 : 위의 접근 방식은 동일한 배열을 유지하므로 배열은 여전히 동일한 길이입니다. 마지막 요소는 null로 설정됩니다. 당신이 원하는 경우 새로운 배열이 정확히 필요한 크기,이 대신 사용 :
array = list.toArray(new String[0]);
Edit3 : 같은 클래스에서이 코드를 자주 사용하는 경우 클래스에 다음 코드를 추가하는 것이 좋습니다.
private static final String[] EMPTY_STRING_ARRAY = new String[0];
그러면 함수는 다음과 같습니다.
List<String> list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);
그러면 new
함수가 호출 될 때마다 처리 되는 쓸모없는 빈 문자열 배열로 힙을 버리는 것을 중지합니다 .
cynicalman의 제안 (댓글 참조)은 힙 쓰레기 처리에도 도움이 될 것이며 공정성을 위해 언급해야합니다.
array = list.toArray(new String[list.size()]);
명시적인 크기를 잘못 이해하는 것이 더 쉬울 수 있기 때문에 내 접근 방식을 선호합니다 (예 : size()
잘못된 목록 호출 ).
답변
Java 8의 대안 :
String[] filteredArray = Arrays.stream(array)
.filter(e -> !e.equals(foo)).toArray(String[]::new);
답변
메이크업 List
과 배열의 아웃 Arrays.asList()
및 통화 remove()
모든 적절한 요소. 그런 다음 toArray()
‘목록’을 호출 하여 다시 배열로 만듭니다.
성능이별로 좋지는 않지만 적절하게 캡슐화하면 나중에 언제든지 더 빠르게 작업을 수행 할 수 있습니다.
답변
언제든지 다음을 수행 할 수 있습니다.
int i, j;
for (i = j = 0; j < foo.length; ++j)
if (!"a".equals(foo[j])) foo[i++] = foo[j];
foo = Arrays.copyOf(foo, i);
답변
외부 라이브러리를 사용할 수 있습니다.
org.apache.commons.lang.ArrayUtils.remove(java.lang.Object[] array, int index)
Apache Commons Lang http://commons.apache.org/lang/ 프로젝트에 있습니다 .
답변
아래 코드 참조
ArrayList<String> a = new ArrayList<>(Arrays.asList(strings));
a.remove(i);
strings = new String[a.size()];
a.toArray(strings);
답변
List
추가 배열 로 변환 하거나 생성 하지 않고 배열에서 여러 요소를 제거해야하는 경우 제거 할 항목 수에 의존하지 않고 O (n)에서 수행 할 수 있습니다.
다음 a
은 초기 배열이며 int... r
제거 할 요소의 고유 한 순서 인덱스 (위치)입니다.
public int removeItems(Object[] a, int... r) {
int shift = 0;
for (int i = 0; i < a.length; i++) {
if (shift < r.length && i == r[shift]) // i-th item needs to be removed
shift++; // increment `shift`
else
a[i - shift] = a[i]; // move i-th item `shift` positions left
}
for (int i = a.length - shift; i < a.length; i++)
a[i] = null; // replace remaining items by nulls
return a.length - shift; // return new "length"
}
소규모 테스트 :
String[] a = {"0", "1", "2", "3", "4"};
removeItems(a, 0, 3, 4); // remove 0-th, 3-rd and 4-th items
System.out.println(Arrays.asList(a)); // [1, 2, null, null, null]
작업에서 먼저 배열을 스캔하여 “a”의 위치를 수집 한 다음을 호출 할 수 removeItems()
있습니다.