자바 : Python의 범위 (int, int)와 동일합니까?


99

Java에는 Python의 range(int, int)방법 과 동등한 기능이 있습니까?


목록을 반환하는 Python 2.x 범위 또는 반복자를 반환하는 Python 3.x 범위 (2.x xrange와 동일)를 의미합니까? 전자는 다른 사람들이 아래에서 한 것처럼 구현하기가 비교적 간단하지만 반복자 버전은 조금 더 까다 롭습니다.
Dave Kirby


모든 범위에 Comparable대해서는 답변을 참조하십시오
c0der

답변:


27

Guava 는 또한 Python과 유사한 것을 제공합니다 range.

Range.closed(1, 5).asSet(DiscreteDomains.integers());

Guava의 AbstractIterator를 사용하여 동일한 종류의 작업을 수행하기 위해 상당히 간단한 반복기를 구현할 수도 있습니다.

return new AbstractIterator<Integer>() {
  int next = getStart();

  @Override protected Integer computeNext() {
    if (isBeyondEnd(next)) {
      return endOfData();
    }
    Integer result = next;
    next = next + getStep();
    return result;
  }
};

6
내 자신의 일반 범위를 구현하기 전에 이것을 보았 으면 좋았을 것입니다. 멋지지만 더 기능적인 언어에 비해 투박한 Java가 얼마나 어설픈 지 다시 한번 상기시켜줍니다.
z7sg Ѫ 2012

14
Range#asSet더 이상 사용되지 않는 것 같습니다. ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
이제이

이것을 사용하려면 어떤 라이브러리를 가져와야합니까?
tgabb

Java 8부터 IntStream 및 LongStream에는 range 및 rangeClosed 메소드가 있습니다.
Jose Manuel Gomez Alvarez


16

Guava 15.0 이후 Range.asSet () 는 더 이상 사용되지 않으며 버전 16에서 제거 될 예정입니다. 대신 다음을 사용하십시오.

ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());

15

Jools 라는 작은 Java 유틸리티 라이브러리에서 작업 중이며 Range필요한 기능을 제공 하는 클래스 가 포함되어 있습니다 (다운로드 가능한 JAR이 있습니다).
생성자 중 하나입니다 Range(int stop), Range(int start, int stop)또는 Range(int start, int stop, int step)(for 루프에 비슷한) 당신은 게으른 평가를 사용하는, 그것을 통해서 반복 처리를 할 수있다, 또는 당신이 사용할 수있는 toList()명시 적 범위 목록을 얻으려면 방법.

for (int i : new Range(10)) {...} // i = 0,1,2,3,4,5,6,7,8,9

for (int i : new Range(4,10)) {...} // i = 4,5,6,7,8,9

for (int i : new Range(0,10,2)) {...} // i = 0,2,4,6,8

Range range = new Range(0,10,2);
range.toList(); // [0,2,4,6,8]

14
public int[] range(int start, int stop)
{
   int[] result = new int[stop-start];

   for(int i=0;i<stop-start;i++)
      result[i] = start+i;

   return result;
}

구문 또는 스타일 오류를 용서하십시오. 나는 일반적으로 C #으로 프로그래밍합니다.


Vivien Barousse가 당신에게 답을 주었다는 점을 감안할 때, 중복을 피하기 위해 당신의 것을 삭제하는 것이 어떻습니까? 물론 그것을 멋지게 살릴 계획이 없다면.
aaronasterling

9
비슷합니다. 나는 내 것이 좀 더 읽기 쉽다고 생각합니다. 그의 "길이"사용은 오해의 소지가 있으며, 그의 파이썬 사양을 충족하지 않는다고 생각합니다 (그는 상한선을 포함합니다. network-theory.co.uk/docs/pytut/rangeFunction.html 에서는 파이썬에서 발생하지 않는다고 말합니다. ). 속임수라고 생각하신다면, 스스로 처리하기에 충분한 평판이 있다고 생각합니다.
KeithS

10

범위의 정수 세트를 가져 오기 위해 다음 코드 스 니펫을 사용할 수 있습니다.

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());

7
public int[] range(int start, int length) {
    int[] range = new int[length - start + 1];
    for (int i = start; i <= length; i++) {
        range[i - start] = i;
    }
    return range;
}

(단지 "아니오"라고 말하는 긴 대답)


또한 python 3의 "range"와 Python 2의 선호하는 "xrange"는 포함 된 각 항목에 대해 메모리를 사용하지 않는 "live"객체를 반환합니다. 자바로 구현하기에는 훨씬 더 클 것입니다.
jsbueno

3

자바 9- IntStream::iterate

Java 9부터 사용할 IntStream::iterate수 있으며 단계를 사용자 정의 할 수도 있습니다. 예를 들어 int배열 을 원하는 경우 :

public static int[] getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, i -> i < max, i -> i + step)
            .toArray();
}

또는 List:

public static List<Integer> getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, i -> i < max, i -> i + step)
            .boxed()
            .collect(Collectors.toList());
}

그리고 그것을 사용하십시오 :

int[] range = getInRange(0, 10, 1);



1

Python 루프에서 사용하는 것처럼 사용하려는 경우 Java는 for 문을 사용하여 멋지게 루프하므로이 구조가 해당 목적에 필요하지 않게 렌더링됩니다.


5
일반적으로 파이썬의 루프에도 사용하지 않습니다. 거의 항상 더 깔끔한 반복 방법이 있습니다.
Daenyth

음, 범위는 일반적으로 for 루프에서 사용됩니다. 그러나 for 루프는 종종 범위없이 사용됩니다.
FogleBird

1
IntStream.range(0, 10).boxed().collect(Collectors.toUnmodifiableList());

1
이 코드가 문제를 해결하는 방법 을 설명하면 도움이 될 것 입니다.
Robert Columbia

0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 객체 스트림을 반환하는 솔루션을 찾고 있고 추가 종속성을 사용하고 싶지 않거나 사용할 수없는 경우 :

Stream.iterate(start, n -> n + 1).limit(stop);

시작 -포함 중지 -독점

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.