1

我一直在为此头疼

我想创建一个区间列表(作为 Tuple2 实例),其范围min介于.maxnumberOfIntervals

这个特定的项目在 java 中(不允许使用 scala),所以我使用的是 vavr,但我可以将任何 scala 解决方案转换为 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)
4

2 回答 2

1

您的第二个代码更好,但是您不会因为任何代码尝试计算定期间隔而仅仅因为最后一个间隔是一个例外 - 无论您这样做,您都必须以某种方式包含一个减少其大小的条件。

我建议使用rangeBy而不是rangeClosed,这应该可以让您正确收集起始元素。您已经有了区间大小,尽管+1您可能想要使用Math.ceil(). 之后,您只想将起始数字与map(x -> Tuple.of(x, Math.min(x + targetSize - 1, max))).

于 2017-11-20T10:38:22.490 回答
0

根据 Piotr Wilkin 的建议,我提出了以下建议

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();
于 2017-11-20T10:54:46.687 回答