Java에서 순차 정수 목록 또는 배열을 생성하려면 어떻게 해야 합니까?
짧고 달콤한 방법으로 이 데이터를 생성할 수 있는 방법은 없나요?List<Integer> 「」라고 하는 가 있습니다.Integer[] ★★★★★★★★★★★★★★★★★」int[]( 값 포함)start을 ""로 합니다.end 가치, 가치, 가치
즉, 다음과 같이 짧지만 동등합니다1.
void List<Integer> makeSequence(int begin, int end) {
List<Integer> ret = new ArrayList<>(end - begin + 1);
for (int i=begin; i<=end; i++) {
ret.add(i);
}
return ret;
}
구아바 사용도 괜찮습니다.
업데이트:
퍼포먼스 분석
이 질문은 네이티브 Java 8과 서드파티 라이브러리를 모두 사용하여 여러 가지 좋은 답변을 받았기 때문에 모든 솔루션의 성능을 테스트해 보려고 합니다.
요소의 .[1..10]다음 방법을 사용합니다.
- classic Array List: 제 질문에서 주어진 코드(본질적으로 adarsh의 답변과 동일)
- Eclipse Collections 8.0을 사용하는 Donald의 답변에 제시된 코드입니다.
- guavaRange: 아래 daveb의 답변으로 주어진 코드.엄밀히 말하면, 이 방법으로 인해
List<Integer>히히 but but butContiguousSet<Integer>- 하지만 구현이 되기 때문에Iterable<Integer>순서상으로는 대부분 제 목적에 맞는 것 같아요 - intStreamRange: 아래 Vladimir의 답변에서 주어진 코드입니다.
IntStream.rangeClosed()되었습니다.- Java 8에서 도입되었습니다. - streamItate: 아래 Catalin의 답변에서 주어진 코드는 다음과 같습니다.
IntStreamJava 8 서 java java java java java java java java java java java java 。
위의 모든 작업에 대해 킬로 연산/초(높을수록 좋습니다)의 결과를 사이즈 10의 리스트와 함께 나타냅니다.
...사이즈 10,000 리스트의 경우:
마지막 표는 정확합니다. Eclipse와 Guava 이외의 솔루션은 너무 느려서 픽셀 바 하나 얻을 수 없습니다.고속 솔루션은 다른 솔루션보다 10,000배에서 20,000배 더 빠릅니다.
물론 여기서 일어나고 있는 것은 guava와 이클립스 솔루션은 실제로 10,000개의 요소 목록을 실현하는 것이 아니라 시작 부분과 끝 부분에 고정 크기의 포장지일 뿐이라는 것입니다.각 요소는 반복 중에 필요에 따라 생성됩니다.이 테스트에서는 실제로 반복하지 않기 때문에 비용이 지연됩니다.다른 모든 솔루션은 실제로 메모리 전체 목록을 구현하여 생성 전용 벤치마크에서 큰 비용을 지불합니다.
좀 더 현실적인 것을 해보죠. 그리고 모든 정수를 합산해서 반복해 봅시다. ㅇㅇㅇㅇ의 IntStream.rangeClosed벤치마크의 특징은 다음과 같습니다.
@Benchmark
public int intStreamRange() {
List<Integer> ret = IntStream.rangeClosed(begin, end).boxed().collect(Collectors.toList());
int total = 0;
for (int i : ret) {
total += i;
}
return total;
}
여기서, 비실체화 솔루션이 여전히 가장 빠르지만, 상황은 많이 변합니다.여기 길이=10:
... 및 길이 = 10,000:
많은 요소에 걸친 긴 반복으로 인해 많은 것들이 개선되지만, 일식과 구아바는 10,000개의 요소 테스트에서도 두 배 이상 빠른 속도로 유지됩니다.
그래서 네가 정말 원한다면List<Integer>선택인 것 스트림을 좀 더를 들어, , Eclipse 렉 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , streams streams streams그러나 스트림을 보다 네이티브하게 사용하는 경우(예를 들어 잊어버리는 경우).boxed()원시 영역을 축소하는 것)은, 이러한 모든 변종보다 빨리 종료할 수 있습니다.
1 에러 처리를 제외하고, 예를 들어 다음과 같이 합니다.end< >begin가 일부 JVM 넘는 를 들어, JVM보다 큰 ).2^31-1.
Java 8에서는 매우 심플하기 때문에 더 이상 별도의 방법이 필요하지 않습니다.
List<Integer> range = IntStream.rangeClosed(start, end)
.boxed().collect(Collectors.toList());
음, 이 라이너 한 대는 (과바 산맥을 사용) 자격이 주어질 수 있습니다.
ContiguousSet<Integer> integerList = ContiguousSet.create(Range.closedOpen(0, 10), DiscreteDomain.integers());
System.out.println(integerList);
해도 ""는 되지 않습니다List<Integer>ContiguousSet에서는, , 같은 .Iterable<Integer>에, 「」가 가능하게 됩니다.foreach「」와 같은 으로 .List<Integer>.
이전 버전(Guava 14 이전 버전)에서는 다음을 사용할 수 있습니다.
ImmutableList<Integer> integerList = Ranges.closedOpen(0, 10).asSet(DiscreteDomains.integers()).asList();
System.out.println(integerList);
둘 다 생산:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
자바8 [1, 2, 3 ... 10 ]의 첫 iterate는 시퀀스의및 ""의 첫 입니다.limit마지막 번호입니다.
List<Integer> numbers = Stream.iterate(1, n -> n + 1)
.limit(10)
.collect(Collectors.toList());
이클립스 컬렉션의 클래스를 사용할 수 있습니다.
List<Integer> range = Interval.oneTo(10);
range.forEach(System.out::print); // prints 12345678910
Interval클래스는 게으르기 때문에 모든 값이 저장되지는 않습니다.
LazyIterable<Integer> range = Interval.oneTo(10);
System.out.println(range.makeString(",")); // prints 1,2,3,4,5,6,7,8,9,10
이 방법은 다음과 같이 구현할 수 있습니다.
public List<Integer> makeSequence(int begin, int end) {
return Interval.fromTo(begin, end);
}
int를 정수로 표시하지 않고 목록 구조를 원하는 경우 Eclipse 컬렉션에서 를 사용할 수 있습니다.
public IntList makeSequence(int begin, int end) {
return IntInterval.fromTo(begin, end);
}
IntList이 sum(),min(),minIfEmpty(),max(),maxIfEmpty(),average() ★★★★★★★★★★★★★★★★★」median()사용할 수 있습니다.
알기 쉽게 갱신: 2017년 11월 27일
안Interval는 입니다.List<Integer>하지만 그것은 게으르고 불변이다.이 기능은 특히 수집을 많이 다루는 경우 검정 데이터를 생성하는 데 매우 유용합니다. 경우 .List,Set ★★★★★★★★★★★★★★★★★」Bag음음음같 뭇매하다
Interval integers = Interval.oneTo(10);
Set<Integer> set = integers.toSet();
List<Integer> list = integers.toList();
Bag<Integer> bag = integers.toBag();
안IntInterval는 입니다.ImmutableIntList되어 있다IntList컨버터 방식도 있습니다.
IntInterval ints = IntInterval.oneTo(10);
IntSet set = ints.toSet();
IntList list = ints.toList();
IntBag bag = ints.toBag();
안Interval ★★★IntInterval 않다equals★★★★★★ 。
이제 원시 스트림에서 원시 컬렉션을 만들 수 있습니다.withAll그리고.ofAll원하는 방법을 선택합니다.궁금하시다면 저희가 왜 여기 두 분 다 모셨는지 설명해드릴게요.이러한 메서드는 가변 및 불변의 Int/Long/Double Lists, Sets, Bag 및 Stacks에 대해 존재합니다.
Assert.assertEquals(
IntInterval.oneTo(10),
IntLists.mutable.withAll(IntStream.rangeClosed(1, 10)));
Assert.assertEquals(
IntInterval.oneTo(10),
IntLists.immutable.withAll(IntStream.rangeClosed(1, 10)));
주의: 저는 Eclipse Collections의 커밋입니다.
이것이 Core Java를 사용하여 얻을 수 있는 가장 짧은 값입니다.
List<Integer> makeSequence(int begin, int end) {
List<Integer> ret = new ArrayList(end - begin + 1);
for(int i = begin; i <= end; i++, ret.add(i));
return ret;
}
Guava Ranges를 사용할 수 있습니다.
해서 받을 수 요.SortedSet를
ImmutableSortedSet<Integer> set = Ranges.open(1, 5).asSet(DiscreteDomains.integers());
// set contains [2, 3, 4]
int[] arr = IntStream.rangeClosed(2, 5).toArray();
System.out.println(Arrays.toString(arr));
// [2, 3, 4, 5]
Integer[] boxedArr = IntStream.rangeClosed(2, 5)
.boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(boxedArr));
// Since Java 16
List<Integer> list1 = IntStream.rangeClosed(2, 5)
.boxed().toList();
System.out.println(list1);
List<Integer> list2 = IntStream.rangeClosed(2, 5)
.boxed().collect(Collectors.toList());
System.out.println(list2);
List<Integer> list3 = Arrays.asList(boxedArr);
System.out.println(list3);
List<Integer> list4 = new ArrayList<>();
IntStream.rangeClosed(2, 5).forEachOrdered(list4::add);
System.out.println(list4);
이게 제가 찾을 수 있는 가장 짧은 길이예요.
버전 목록
public List<Integer> makeSequence(int begin, int end)
{
List<Integer> ret = new ArrayList<Integer>(++end - begin);
for (; begin < end; )
ret.add(begin++);
return ret;
}
어레이 버전
public int[] makeSequence(int begin, int end)
{
if(end < begin)
return null;
int[] ret = new int[++end - begin];
for (int i=0; begin < end; )
ret[i++] = begin++;
return ret;
}
이게 너한테 맞을지도 몰라...
void List<Integer> makeSequence(int begin, int end) {
AtomicInteger ai=new AtomicInteger(begin);
List<Integer> ret = new ArrayList(end-begin+1);
while ( end-->begin) {
ret.add(ai.getAndIncrement());
}
return ret;
}
언급URL : https://stackoverflow.com/questions/10242380/how-can-i-generate-a-list-or-array-of-sequential-integers-in-java
'programing' 카테고리의 다른 글
| Java 설치를 위한 환경 변수 (0) | 2022.08.03 |
|---|---|
| 코드 분할 vuex 응용 프로그램 (0) | 2022.08.03 |
| strcpy vs. memcpy (0) | 2022.08.03 |
| VueJS - 패스 함수명과 콜의 차이 (0) | 2022.08.03 |
| bind()를 호출할 때 sockaddr_in을 sockaddr에 캐스팅하는 이유는 무엇입니까? (0) | 2022.08.03 |



