ArrayList에서 Array로 변환하는 것이 안전 / 권장되는지 알고 싶습니다. 각 줄에 문자열이있는 텍스트 파일이 있습니다.
1236
1233
4566
4568
....
배열 목록으로 읽어 들인 다음 배열로 변환합니다. 그렇게하는 것이 합법적입니까?
감사
ArrayList에서 Array로 변환하는 것이 안전 / 권장되는지 알고 싶습니다. 각 줄에 문자열이있는 텍스트 파일이 있습니다.
1236
1233
4566
4568
....
배열 목록으로 읽어 들인 다음 배열로 변환합니다. 그렇게하는 것이 합법적입니까?
감사
답변:
예 , ArrayList
를Array
. 좋은 아이디어인지 여부는 의도 된 용도에 따라 다릅니다. ArrayList
제공 하는 작업이 필요 합니까? 그렇다면 ArrayList
. 그렇지 않으면 멀리 개종하십시오!
ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);
출력
bar.length = 5
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
이것이 최선의 방법 (IMHO)입니다.
List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);
이 코드는 다음과 같이 작동합니다.
String[] myArray = myArrayList.toArray(new String[0]);
그러나 덜 효과적입니다. 문자열 배열이 두 번 생성됩니다. 처음에 길이가 0 인 배열이 생성 된 다음 실제 크기 배열이 생성되고 채워지고 반환됩니다. 따라서 필요한 크기 (부터 list.size()
) 를 알고 있기 때문에 모든 요소를 넣을 수있을만큼 큰 배열을 만들어야합니다. 이 경우 재 할당되지 않습니다.
new String[0]
과new String[size]
new String[0]
실제로 더 효율적입니다. shipilev.net/blog/2016/arrays-wisdom-ancients
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);
"좋은 아이디어"인지 여부는 실제로 사용 사례에 따라 달라집니다.
Object
v가 ArrayList라고 가정합니다.
String[] x = (String[]) v.toArray(new String[0]);
컬렉션을 배열로 변환하는 두 가지 스타일이 있습니다. 미리 크기가 c.toArray(new String[c.size()])
지정된 배열 (예 :) 또는 빈 배열 (예 :)을 사용합니다 c.toArray(new String[0])
. 사전 크기 배열을 사용하는 이전 Java 버전에서는 적절한 크기의 배열을 만드는 데 필요한 리플렉션 호출이 매우 느리기 때문에 권장되었습니다. 그러나 빈 배열 (최신 Java에서 권장 됨)을 사용하거나 사전 크기 배열 (이전 Java 버전 또는 HotSpot 기반이 아닌 JVM에서 더 빠를 수 있음)을 사용하는 최신 업데이트 이후 . OpenJDK 6의 호출이 내재되어 빈 어레이 버전의 성능이 미리 크기 조정 된 버전과 비교하여 동일하고 때로는 더 나아졌습니다. 또한 사전 크기 배열을 전달하는 것은 크기와 toArray 호출 사이에 데이터 경합이 가능하기 때문에 동시 또는 동기화 된 수집에 위험합니다.이 경우 수집이 작업 중에 동시에 축소 된 경우 배열 끝에 추가 null이 발생할 수 있습니다. 유니폼 스타일을 따를 수 있습니다.
최신 Java (> Java 6)에 권장되는 사용법입니다.
String[] myArray = myArrayList.toArray(new String[0]);
사전 크기 배열을 사용하는 이전 Java 버전에서는 적절한 크기의 배열을 만드는 데 필요한 리플렉션 호출이 매우 느리기 때문에 권장되었습니다. 그러나 OpenJDK 6의 최신 업데이트 이후이 호출이 내재되어 빈 어레이 버전의 성능이 미리 크기 조정 된 버전과 비교하여 동일하고 때로는 더 나아졌습니다. 또한 사전 크기 배열을 전달하는 것은 크기와 toArray 호출 사이에 데이터 경합이 가능하기 때문에 동시 또는 동기화 된 수집에 위험합니다.이 경우 수집이 작업 중에 동시에 축소 된 경우 배열 끝에 추가 null이 발생할 수 있습니다. 이 검사를 통해 빈 배열 (최신 Java에서 권장 됨)을 사용하거나 사전 크기 배열 (이전 Java 버전 또는 HotSpot 기반이 아닌 JVM에서 더 빠를 수 있음)을 사용하여 균일 한 스타일을 따를 수 있습니다.
Collection 인터페이스에는 새 컬렉션을 배열로 변환하는 toArray () 메서드가 포함되어 있습니다. 이 방법에는 두 가지 형태가 있습니다. 인수가없는 버전은 컬렉션의 요소를 Object 배열로 반환합니다. public Object [] toArray (). 반환 된 배열은 다른 데이터 유형으로 캐스트 할 수 없습니다. 이것은 가장 간단한 버전입니다. 두 번째 버전에서는 반환하려는 배열의 데이터 유형을 전달해야합니다. public Object [] toArray (Object type []).
public static void main(String[] args) {
List<String> l=new ArrayList<String>();
l.add("A");
l.add("B");
l.add("C");
Object arr[]=l.toArray();
for(Object a:arr)
{
String str=(String)a;
System.out.println(str);
}
}
참고로 http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html 링크를 참조하십시오.
한 가지 방법은 첫 번째 for 루프 내에서 인쇄가 수행되는 두 번째 for 루프를 추가하는 것입니다. 이렇게 :
static String[] SENTENCE;
public static void main(String []args) throws Exception{
Scanner sentence = new Scanner(new File("assets/blah.txt"));
ArrayList<String> sentenceList = new ArrayList<String>();
while (sentence.hasNextLine())
{
sentenceList.add(sentence.nextLine());
}
sentence.close();
String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
// System.out.println(sentenceArray.length);
for (int r=0;r<sentenceArray.length;r++)
{
SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array
for (int i=0;i<SENTENCE.length;i++)
{
System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
}
}
}