programing

컬렉션을 어레이로 변환하는 가장 쉬운 방법

yoursource 2022. 9. 17. 11:09
반응형

컬렉션을 어레이로 변환하는 가장 쉬운 방법

예를 들어,Collection<Foo>. (현재 컨텍스트에서 LoC에서 가장 짧은) 변환 방법은 무엇입니까?Foo[] 알려진 라이브러리는 모두 허용됩니다.

UPD: (이 섹션의 한 가지 케이스가 더 있습니다.다른 스레드를 작성할 필요가 있다고 생각되는 경우는, 코멘트를 남겨 주세요).변혁은 어떨까요?Collection<Foo>로.Bar[]어디에Bar유형의 매개 변수가 1개인 생성자가 있음Foo예.public Bar(Foo foo){ ... }?

어디에x는 컬렉션입니다.

Foo[] foos = x.toArray(new Foo[x.size()]);

Java 8을 사용하여 업데이트된 질문에 대한 대체 솔루션:

Bar[] result = foos.stream()
    .map(x -> new Bar(x))
    .toArray(size -> new Bar[size]);

여러 번 또는 루프에서 사용하는 경우 상수를 정의할 수 있습니다.

public static final Foo[] FOO = new Foo[]{};

변환하는 방법을 가르쳐 주세요.

Foo[] foos = fooCollection.toArray(FOO);

toArraymethod는 빈 어레이를 사용하여 타깃 어레이의 올바른 유형을 결정하고 새 어레이를 만듭니다.


업데이트에 대한 제안서는 다음과 같습니다.

Collection<Foo> foos = new ArrayList<Foo>();
Collection<Bar> temp = new ArrayList<Bar>();
for (Foo foo:foos) 
    temp.add(new Bar(foo));
Bar[] bars = temp.toArray(new Bar[]{});

JDK/11을 사용하는 경우, 다른 변환 방법인Collection<Foo>에 대해서Foo[]다음과 같이 사용할 수 있습니다.

Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11

메일링 리스트의 @Stuart에서 설명한 바와 같이 (강조된) 퍼포먼스는 기본적으로 기존 퍼포먼스와 같아야 합니다.

결론은 다음과 같은 구현이러한 구현은Arrays.copyOf()가 가장 빠릅니다.아마 본질적인 것이기 때문일 것입니다.

어레이 내용 전체를 덮어쓸 수 있으므로 새로 할당된 어레이가 0으로 채워지는 것을 방지할 수 있습니다.이는 퍼블릭 API의 외관에 관계없이 해당됩니다.

JDK 내의 API 실장은 다음과 같습니다.

default <T> T[] toArray(IntFunction<T[]> generator) {
    return toArray(generator.apply(0));
}

디폴트 실장 콜generator.apply(0)0-Length 어레이를 취득하고 콜만 하면 됩니다.toArray(T[]). 이것은 를 통과합니다.Arrays.copyOf()빠른 경로이므로 기본적으로 와 같은 속도입니다.


참고: API 사용은 다음 코드와 함께 하위 비호환성과 함께 안내되어야 합니다.null예를 들어, 이러한 콜은 기존 콜 때문에 모호하기 때문에toArray(T[] a)컴파일에 실패합니다.

프로젝트에서 Guava를 사용하는 경우 를 사용할 수 있습니다.

Foo[] foos = Iterables.toArray(x, Foo.class);

다음은 사례 업데이트 섹션의 최종 해결 방법입니다(Google 컬렉션 지원).

Collections2.transform (fooCollection, new Function<Foo, Bar>() {
    public Bar apply (Foo foo) {
        return new Bar (foo);
    }
}).toArray (new Bar[fooCollection.size()]);

단, 여기서의 주요 접근법은 doublep의 답변에 언급되어 있습니다(잊고 있었습니다).toArray메서드).

원본에 대해서는 doublep 답변을 참조하십시오.

Foo[] a = x.toArray(new Foo[x.size()]);

업데이트에 대해서:

int i = 0;
Bar[] bars = new Bar[fooCollection.size()];
for( Foo foo : fooCollection ) { // where fooCollection is Collection<Foo>
    bars[i++] = new Bar(foo);
}    

실제로 현대 자바에서는 명시적인 크기를 설정하지 않은 버전이 더 빠릅니다.SO 답변 참조:

.toArray(새로운 MyClass[0]) 또는 .toArray(새로운 MyClass[myList.size()])?

이것은, 독자적인 조사와 인텔리J의 팀에 의해서 뒷받침되고 있습니다.

즉, 이것이 오늘날 가장 빠른 접근법입니다.

Foo[] foos = x.toArray(new Foo[0])

또는, 조금 더 안전하다면, 더 좋을 것이다.

Foo[] foos = x == null ? null : x.toArray(new Foo[0])

Foo[] foos = x.toArray(새로운 Foo[0]);

예를 들어 Student 클래스 요소가 포함된 ArrayList 컬렉션이 있다고 가정합니다.

List stuList = new ArrayList();
Student s1 = new Student("Raju");
Student s2 = new Student("Harish");
stuList.add(s1);
stuList.add(s2);
//now you can convert this collection stuList to Array like this
Object[] stuArr = stuList.toArray();           // <----- toArray() function will convert collection to array

언급URL : https://stackoverflow.com/questions/3293946/the-easiest-way-to-transform-collection-to-array

반응형