2017-11-20 4 views
1

의 X 번호로 범위.으로 나눔 (Tuple2 인스턴스로) 내가 간격의 목록을 만들려면이</p> <p>동안 내 머리를 깨는 된 범위

이 특정 프로젝트에 자바 (더 스칼라는 허용되지 않습니다)에, 그래서 내가 vavr를 사용하고 있지만, 어떤 스칼라 솔루션은 아마

을 vavr 번역 할 수있는이 내 솔루션입니다 :

final int numberOfIntervals = 7; 

final int min = 1; 
final int max = 100; 

final int targetSize = (max - min)/numberOfIntervals + 1; 
final List<Tuple2<Integer, Integer>> l = Iterator.rangeClosed(min, max) 
     .grouped(targetSize) 
     .map(l -> Tuple.of(l.head(), l.last())).toList(); 

이 작품 :

(1, 15) 
(16, 30) 
(31, 45) 
(46, 60) 
(61, 75) 
(76, 90) 
(91, 100) 

그러나 이것은 긴 중간 목록을 만듭니다. 나는 또한이 같은 것을 가지고 노는되었습니다

final int numberOfIntervals = 7; 

final int min = 1; 
final int max = 100; 

final int targetSize = (max - min)/numberOfIntervals + 1; 
final List<Tuple2<Integer, Integer>> l = Iterator 
     .rangeClosedBy(min, max + targetSize, targetSize).sliding(2) 
     .map(s -> of(s.get(0), s.get(1) - 1)) 
     .toList(); 

그러나 이것으로 마지막 범위는 최대 값보다 큰 :

(1, 15) 
(16, 30) 
(31, 45) 
(46, 60) 
(61, 75) 
(76, 90) 
(91, 105) 
+0

함께했다, 당신은 어떤 결과를 원하는가? '100/7 = 14.285714', 그래서 15 그룹의 6 그룹과 10 그룹의 최종 그룹? 14 그룹의 15 그룹과 5 그룹의 2 그룹? 그렇다면'15 15 14 14 14 14 14' 또는'14 14 14 14 14 15 15'또는'14 14 14 15 14 14 15' 또는 다른 것? – Andreas

+0

@Andreas가 결과를 추가 했으므로 마지막 범위가 더 작아 지므로이 경우'(91, 100)' – jen

답변

1

두 번째 코드는 더 나은,하지만 당신은 지금까지받지 않습니다 마지막 간격이 예외이기 때문에 규칙적인 간격을 계산하려고하는 모든 코드가 있습니다.하지만 그렇게하면 크기를 줄이는 조건을 포함해야합니다.

rangeClosed 대신 rangeBy을 사용하는 것이 좋습니다. 그러면 시작 요소를 올바르게 수집 할 수 있습니다.을 하드 코딩하는 대신 (간격 수가 나머지없이 범위 크기를 나눌 경우 잘못된 결과를 산출 함) 대신에 Math.ceil()을 사용하는 것이 좋지만 이미 간격 크기가 있습니다. 그런 다음 시작 번호를 map(x -> Tuple.of(x, Math.min(x + targetSize - 1, max)))으로 매핑하면됩니다. (100 개) 값이 7 개 동일한 크기의 그룹으로 분리 될 수 없기 때문에 표트르 WILKIN의 제안을 바탕으로

0

난 다음

final int numberOfIntervals = 7; 

final int min = 1; 
final int max = 100; 

final int targetSize = (int) Math.ceil((max - min)/numberOfIntervals) ; 
final List<Tuple2<Integer, Integer>> l = Iterator 
     .rangeBy(min, max + targetSize, targetSize).sliding(2) 
     .map(s -> of(s.get(0), s.get(1)-1)) 
     .map(t->t.map2(i->Math.min(i,max))) 
     .toList();