2014-04-03 4 views
3

데이터베이스에서 일부 정보를 가져옵니다. 나는 주어진 테이블의 객체의 ArrayList를 만드는 메소드를 가지고있다. 도구, 고객 및 기타와 마찬가지로ArrayList에서 배열로 객체

나는 ArrayList를 취하고 콘텐츠 유형의 동적 목록 (Tool [])을 반환하는 작은 도움을 줄 수 있는지 궁금합니다. 객체의 유형마다 메소드를 작성 하시겠습니까? 그것을 해결하는 더 역동적 인 방법이 있습니까?

public Verktoy[] ToolsArray(ArrayList<Verktoy> b){ 
    Verktoy[] a = new Verktoy[b.size()]; 
    for(int i = 0; i<b.size(); i++){ 
     a[i] = b.get(i); 
    } 
    return a; 
} 
+0

가능한 복제본 : http://stackoverflow.com/questions/7969023/from-arraylist-to-array – csvan

+0

복제본이 없으므로 검색을하고 그 중 하나를 보았습니다. – simonkaspers1

+0

* "목록 반환 (도구 [])"* 이 부분을 분명히 해 주시겠습니까?'list (Tool []) '가 전달해야하는 것이 무엇인지 모르겠습니다. – Radiodef

답변

1

: 당신은 뭔가를 할 수 있습니다 정말 일반적이지 않은 것을 제외하고는이를 수행하는 메소드를 정의합니다. 복사 할 배열을 지정하거나 Object[]을 사용해야합니다.

List<String> strList = new ArrayList<String>(); 
Object[] objArr = strList.toArray(); 
String[] strArr = strList.toArray(new String[strList.size()]); 

나는 둘 중 누구도 원하지 않는 것으로 가정합니다. 불행히도 자바에서 배열을 일반적으로 만들 수 없기 때문에 원하는 것을 정확히 수행 할 방법이 없습니다. 방법으로 돌아 간다 :

public static <E> E[] toArray(List<E> list) { 
    E[] arr = new E[list.size()]; // doesn't compile 

    return list.toArray(arr); 
} 

Eerased 것을되는 문제는 그래서 컴파일 가능한 자바 코드가 아닙니다. 실행시에 이 존재하지 않아 new E을 수행 할 수 없습니다.

그래서 당신이 얻을 수있는 가장 가까운이 같다 :

public static <E> E[] toArray(List<E> list, Class<E> e) { 
    @SuppressWarnings("unchecked") 
    final E[] arr = (E[])Array.newInstance(e, list.size()); 

    return list.toArray(arr); 
} 

을하지만 정말 사용하기 더 편리하지 않습니다 :

List<String> strList = new ArrayList<String>(); 
String[] strArr = toArray(strList, String.class); 

ArrayList을 확장하는 또 다른 흥미로운 방법이있다 이 기능을 추가하십시오. 하지만 여전히 Class<E> 개체가 필요합니다. 이처럼 할 거라고 :

import java.util.Arraylist; 
import java.util.Objects; 
import java.lang.reflect.Array; 

public class TypedList<E> extends ArrayList<E> { 
    private final Class<E> e; 

    public TypedList(Class<E> e) { 
     this.e = Objects.requireNonNull(e); 
    } 

    @Override 
    public E[] toArray() { 
     @SuppressWarnings("unchecked") 
     final E[] arr = (E[])Array.newInstance(e, size()); 
     return toArray(arr); 
    } 
} 

이 당신이 처음에 Class<E>를 지정하고 나중에 당신이, 예를 들어 인수와 toArray를 호출 할 수 있습니다:

TypedList<String> strList = new TypedList<String>(String.class); 
String[] strArray = strList.toArray(); 

나는 어레이를 일반적으로 사용하려고 시도하는 것을 피하려고한다. 그들은 이런 종류의 일에 좋지 않습니다.

+0

그래서 C 언어와 같이 id []와 같은 것이 없습니까? – simonkaspers1

1

네, 그렇게 할 수 있습니다 - 이것이 제네릭의 목적입니다.

public static <E> E[] toArray(List<E> list); 

그리고 사용법은 다음과 같습니다 :

List<String> strList = new ArrayList<String>(); 
String[] strArr = toArray(strList); 

List<Integer> intList = new ArrayList<Integer>(); 
Integer[] intArr = toArray(intList); 

이제, List 이미 언급 한 바와 같이 그러니까 기본적으로 당신이 원하는 방법 서명이 같다

List<T> list = new ArrayList<T>(); 
T [] elements = list.toArray(new T[list.size()]); 
+0

일반적인 배열 생성 (컴파일 오류)을 제안 하시겠습니까? – Radiodef

+0

배열의 어떤 종류가 반환하는지 말해야합니까? 아니면 obj.c에서 'id'와 같은 것입니까? – simonkaspers1