【问题标题】:How to define a math function for a sequence of values?如何为一系列值定义数学函数?
【发布时间】:2021-03-27 03:31:25
【问题描述】:

我需要产生一个数字序列:

2、4、6、8、10、12、14、16、18、20、24、28、32、36、40、44、48、52、 58、64、70、76、84、92、100、108、120、132、144

我目前的实现很简单:

private Set<NameValuePair> getUsersParams(int interval, int size) {
    return IntStream.iterate(interval, it -> inc(it, interval))
                    .limit(size)
                    .mapToObj(value -> new BasicNameValuePair("u", String.valueOf(value)))
                    .collect(Collectors.toSet());
}

private int inc(int value, int interval) {
    var increment = resolveIncrementFor(value, interval);
    return value + increment;
}

private int resolveIncrementFor(int value, int baseInterval) {
    if (value < 20) {
        return baseInterval;
    }
    if (value < 52) {
        return baseInterval * 2;
    }
    if (value < 76) {
        return baseInterval * 3;
    }
    if (value < 108) {
        return baseInterval * 4;
    }
    return baseInterval * 6;
}

是否存在任何工具可以为我构建一个简单的数学函数或算法(可能带有递归),这将有助于避免我硬编码值?
或者任何允许我手动定义它的算法?

【问题讨论】:

  • 我不太明白你想做什么。你能说得更具体点吗?
  • @Babofett 我想要一个函数,它可以让我避免硬编码范围并像IntStream.range(1,29).map(i -&gt; func(i)).collect(toList()) 一样写出我上面写的结果。像斐波那契行,但对于我的序列。

标签: java function math statistics sequence


【解决方案1】:

如果我理解正确,您可以使用规则定义 Map 或 List。规则将由谓词和函数组成。像这样的东西(虽然代码没有经过测试):

private Set<NameValuePair> getUsersParams(int interval, int size, List<Rule<Predicate<Integer>, Function<Integer,Integer>>> rules) {
    return IntStream.range(1,29)
                .map((index) -> getValue(interval, index, rules))
                .mapToObj(value -> new BasicNameValuePair("u", String.valueOf(value)))
                .collect(Collectors.toSet());
}

private int getValue(int interval, int index, List<Rule<Predicate<Integer>, Function<Integer,Integer>>> rules) {
    for (Rule<Predicate<Integer>,Function<Integer,Integer>> entry : rules) {
        if(entry.key.test(index))
            return entry.value.apply(interval);
    }
}

static class Rule<T1,T2> {
    T1 key;
    T2 value;
    Rule(T1 key, T2 value) {
        this.key = key;
        this.value = value;
    }
}

List<Rule<Predicate<Integer>, Function<Integer,Integer>>> rules = new ArrayList();  
rules.add(new Rule((input -> input < 20), (interval) -> interval));
rules.put(new Rule((input -> input < 52), (interval) -> interval * 2));
rules.add(new Rule((input -> input < 76), (interval) -> interval * 3));
rules.add(new Rule((input -> input < 108), (interval) -> interval * 4));
rules.add(new Rule((input -> input >= 108), (interval) -> interval * 6));

当涉及到方法签名时,现在代码仍然很混乱而且有点多余,但我想你明白了要点。

您可以在不触及主代码的情况下添加新规则,因此它的硬编码更少并且适用于不同的序列。

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2020-09-27
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多