programing

Java에서 순차 정수 목록 또는 배열을 생성하려면 어떻게 해야 합니까?

prostudy 2022. 8. 3. 20:56
반응형

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)

... 및 길이 = 10,000:

목록 <정수> 반복(길이=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);
}

IntListsum(),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★★★★★★ 。

Eclipse 컬렉션 9.0 업데이트

이제 원시 스트림에서 원시 컬렉션을 만들 수 있습니다.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

반응형