Java 어레이를 Itable로 변환
int [ ] foo 등의 원어민 배열이 있습니다.작은 사이즈일 수도 있고 아닐 수도 있어요.
int foo[] = {1,2,3,4,5,6,7,8,9,0};
이 가장 요?Iterable<Integer>
떻게게 할?? ???
Iterable<Integer> fooBar = convert(foo);
주의:
루프를 사용하여 대답하지 마십시오(컴파일러가 어떻게 스마트하게 처리하는지 설명할 수 있는 경우를 제외하고).
또, 주의해 주세요.
int a[] = {1,2,3};
List<Integer> l = Arrays.asList(a);
컴파일도 안 된다
Type mismatch: cannot convert from List<int[]> to List<Integer>
또한 어레이를 Itable에 할당할 수 없는 이유를 선택하십시오.대답하기 전에
또, Guava등의 라이브러리를 사용하고 있는 경우는, 이것이 최적인 이유에 대해 설명해 주세요(Google로부터의 완전한 답변은 아니기 때문에:P).
마지막으로, 그것에 대한 숙제가 있는 것 같기 때문에, 숙제가 많은 코드를 투고하는 것을 피한다.
Integer foo[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
List<Integer> list = Arrays.asList(foo);
// or
Iterable<Integer> iterable = Arrays.asList(foo);
'VIP'를 Integer
안레이가 )int
어레이)를 설정합니다.
프리미티브의 경우 guava를 사용할 수 있습니다.
Iterable<Integer> fooBar = Ints.asList(foo);
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
<type>jar</type>
</dependency>
람다를 탑재한 자바8의 경우: (진권의 답변에서 영감을 얻음)
final int[] arr = { 1, 2, 3 };
final Iterable<Integer> i1 = () -> Arrays.stream(arr).iterator();
final Iterable<Integer> i2 = () -> IntStream.of(arr).iterator();
final Iterable<Integer> i3 = () -> IntStream.of(arr).boxed().iterator();
내 2센트만:
final int a[] = {1,2,3};
java.lang.Iterable<Integer> aIterable=new Iterable<Integer>() {
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
private int pos=0;
public boolean hasNext() {
return a.length>pos;
}
public Integer next() {
return a[pos++];
}
public void remove() {
throw new UnsupportedOperationException("Cannot remove an element of an array.");
}
};
}
};
Java 8을 사용하면 이 작업을 수행할 수 있습니다.
final int[] arr = {1, 2, 3};
final PrimitiveIterator.OfInt i1 = Arrays.stream(arr).iterator();
final PrimitiveIterator.OfInt i2 = IntStream.of(arr).iterator();
final Iterator<Integer> i3 = IntStream.of(arr).boxed().iterator();
Guava는 원하는 어댑터를 Int.asList()로 제공합니다.관련 클래스의 각 원시 유형에 해당하는 것이 있습니다. 예를 들어, 다음과 같습니다.Booleans
★★★★★★에boolean
등등.
int foo[] = {1,2,3,4,5,6,7,8,9,0};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
System.out.println(i);
}
의 「 」를 사용하기 사항.Arrays.asList
컴파일을 해도 동작하지 않습니다.Iterator<int[]>
Iterator<Integer>
어레이에 의해 백업되는 목록을 작성하는 것이 아니라 어레이를 포함하는1 요소 목록을 작성하게 됩니다.
8 8 " " "Iterable
는 기능 하는 것입니다.Iterator
아, 아, 아, 아, 아, 아, 아, 아, 아.
static Iterable<Integer> convert(int[] array) {
return () -> Arrays.stream(array).iterator();
}
그리고.
int[] array = {1, 2, 3};
Iterable<Integer> iterable = convert(array);
for (int i : iterable)
System.out.println(i);
출력:
1
2
3
저도 같은 문제가 있어서 이렇게 해결했어요.
final YourType[] yourArray = ...;
return new Iterable<YourType>() {
public Iterator<YourType> iterator() {
return Iterators.forArray(yourArray); // Iterators is a Google guava utility
}
}
다.UnmodifiableIterator
하지만 그게 바로 내가 필요했던 거야
는 동의만 할 수 있습니다.Arrays.asList(T...)
는, 비 프라이머리 데이터 타입의 래퍼 타입 또는 어레이에 최적인 솔루션인 것은 분명합니다. 스태틱의 를 호출합니다.AbstractList
의 Arrays
기본적으로 지정된 배열 참조를 필드로 저장하고 필요한 메서드를 재정의하여 목록을 시뮬레이션합니다.
어레이의 프라이머리 타입과 래퍼 타입 중 하나를 선택할 수 있는 경우, 그러한 상황에서는 래퍼 타입을 사용하고 싶습니다만, 물론 그것이 항상 유용하거나 필요한 것은 아닙니다.실행할 수 있는 방법은 다음 두 가지뿐입니다.
1) 유형배열에 수 (1) 각 、 ( 、 ( 、 ( 、 ( 、 ( 、 (( ( )boolean, byte, short, int, long, char, float, double
, 반환Iterable<
Wrapper Type wrapper wrapper>
Iterator
(비밀(이행)Iterable
를 들어, '아까운')의할 수 int[]
를 필드로 하여 메서드를 구현합니다.
이할 수 (-> 새로 Arrays.asList()
).
2)메서드가에 (수) 2) 어레이는 할 수 .Iterator
중 하나하여 새 클래스를 .Iterable
Iterable
또는 서브타입입니다.
Collection을 Iterable
하는 경우는 ), 「」를 입니다.Iterable
('왜냐하면'는'유형 배열'이기 때문에)Object[]
elements를 없지만, .primitive type 요 、 doesn에에 doesn ) 。
루프의 원인은 다음과 같이 쉽게 설명할 수 있습니다.
각 컬렉션에 대해 오브젝트가 필요하고 원시 데이터형은 오브젝트가 아닙니다.개체는 원시 유형보다 훨씬 크기 때문에 원시 유형 배열의 각 요소에 대해 생성해야 하는 추가 데이터가 필요합니다. 3의 두 방법(', 3'을 사용)이 Arrays.asList(T...)
하는 경우 오브젝트의 집합은 값별로 .이 경우 각 기본 값에 대해 생성해야 합니다.int[]
래퍼 개체를 배열합니다.세 번째 방법은 어레이를 그대로 사용하고, 퍼포먼스가 빠르기 때문에 익명 클래스에서 사용하는 것이 좋습니다.
전략도 요.Object
"배열"을 사용합니다.Iterable
인수의 타입을 특정하기 위해서는 타입 체크가 필요하지만 오브젝트가 항상 필요한 타입은 아니라는 점과 경우에 따라서는 다른 코드가 필요하다는 점을 고려할 필요가 있기 때문에 전혀 권장하지 않습니다.
수 없는 Generic Generic Type을 사용함으로써 많은 할 수 . Generic Type은 기본형을 Generic Type으로 사용하는 것을 허용하지 않으며, 단순하게 사용함으로써 많은 코드를 절약할 수 있습니다.Arrays.asList(T...)
따라서 각 원시 유형 배열에 대해 프로그래밍해야 합니다. 이러한 방식은 기본적으로 사용된 유형 인수에 대해 별도의 방식으로 작성되는 C++ 프로그램에서 사용되는 메모리와 차이가 없습니다.
선인장에서 이용하실 수 있습니다.
Iterable<String> names = new IterableOf<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
);
그런 다음 다음을 사용하여 목록으로 변환할 수 있습니다.
List<String> names = new ListOf<>(
new IterableOf<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
)
);
또는 간단히 말하면:
List<String> names = new ListOf<>(
"Scott Fitzgerald", "Fyodor Dostoyevsky"
);
이미 비슷한 답변이 올라오고 있지만, 새로운 PrimiticIterator를 사용하는 이유는 무엇이라고 생각합니다.OfInt는 명확하지 않았다.Java 8 PrimitiveIterator는 원시적인 int 타입에 특화되어 있기 때문에(또한 박싱/언박싱 패널티를 회피합니다) 좋은 해결책은 Java 8 PrimitIterator를 사용하는 것입니다.
int[] arr = {1,2,3};
// If you use Iterator<Integer> here as type then you can't get the actual benefit of being able to use nextInt() later
PrimitiveIterator.OfInt iterator = Arrays.stream(arr).iterator();
while (iterator.hasNext()) {
System.out.println(iterator.nextInt());
// Use nextInt() instead of next() here to avoid extra boxing penalty
}
참고 자료: https://doc.bccnsoft.com/docs/jdk8u12-docs/api/java/util/PrimitiveIterator.OfInt.html
Java8에서는 IntSteam 스트림을 Integress 스트림에 박스화할 수 있습니다.
public static Iterable<Integer> toIterable(int[] ints) {
return IntStream.of(ints).boxed().collect(Collectors.toList());
}
어레이의 크기에 따라 퍼포먼스가 중요하다고 생각합니다.
언급URL : https://stackoverflow.com/questions/10335662/convert-java-array-to-iterable
'programing' 카테고리의 다른 글
스레드에서 예외를 포착하는 방법 (0) | 2022.08.03 |
---|---|
std::labs()의 용도는 무엇입니까? (0) | 2022.08.03 |
IntelliJ IDEA에서 응용 프로그램 실행 프로파일의 클래스 경로에 디렉토리를 추가하는 방법 (0) | 2022.08.03 |
createElement 렌더 기능을 사용하여 javascript에서 vue.sync를 쓰는 방법 (0) | 2022.08.03 |
Java에서 범용 목록을 복제하려면 어떻게 해야 합니까? (0) | 2022.08.03 |