将加权值计算为整数以用于布局

时间:2019-02-28 22:39:12

标签: math

我的布局中:

  • 该页面分为多个固定宽度的,可以容纳整个页面。
  • 个框的行适合这些,每个列都跨越了许多
  • 每个框都有一个权重,用于确定其列跨度(即:如果一行有6个和2个,权重为1和2,的列跨度分别为2和4)。

如果允许使用小数列跨度,这将很简单(将每个权重乘以列数,再除以总权重),但是将其分解为整数会更加困难。这是我想出的:

function weightedIntegerValues(weights, total) {
    const totalWeight = totalValues(weights);
    const weightedValues = weights.map(weight => Math.round(total * weight / totalWeight));

    for (let totalValue = totalValues(weightedValues); totalValue > total; totalValue = totalValues(weightedValues))
        subtractOneFromHighest(weightedValues);

    return weightedValues;
}

为简便起见,我省略了以下功能:

  • totalValues-获取数组中所有值的总和
  • subtractOneFromHighest-在数组中找到最大值,并从中减去1(就地修改数组)

该函数的工作方式如下:

  1. 如上所述计算加权值,但是在进行过程中将每个值四舍五入
  2. 不断从weightedValues的最大值中减去1,直到weightedValues的总和小于或等于total(考虑到四舍五入的任何0.5对)< / li>

此功能有两个主要问题:

  1. 效率极低(totalValuessubtractOneFromHighest都必须遍历函数主循环中的数组)
  2. 错误地主张减少发现的第一个“最高价值”。

为说明第(2)点,请考虑以下内容:

weightedIntegerValues([1, 2, 4, 3], 5); // [1, 1, 1, 2]

加权函数找到了[1, 1, 2, 2]的舍入值,确定该值大于期望的总和5,并从发现的第一个最高值(索引3)中减去了1,但实际上我们希望减去索引4中的1(四舍五入前为1.5),给我们[1, 1, 2, 1]

我的问题如下:

  1. 这可以比N 2 更好吗?最好降到N。
  2. 是否有一些简单且更数学的方法来支持四舍五入为0.5的数字,而不是偏左或偏右的值?
  3. 是否有一些neato CSS可以为我处理此用例? Flex-box非常接近,但对我来说还不是很完整(这可能是另外一个完整的问题)。

1 个答案:

答案 0 :(得分:0)

这是一种基于this答案的模糊实现方法:

/**
 * Determine a Jackson JavaType for the given JMS Message,
 * typically parsing a type id message property.
 * <p>The default implementation parses the configured type id property name
 * and consults the configured type id mapping. This can be overridden with
 * a different strategy, e.g. doing some heuristics based on message origin.
 * @param message the JMS Message to set the type id on
 * @throws JMSException if thrown by JMS methods
 * @see #setTypeIdOnMessage(Object, javax.jms.Message)
 * @see #setTypeIdPropertyName(String)
 * @see #setTypeIdMappings(java.util.Map)
 */
protected JavaType getJavaTypeForMessage(Message message) throws JMSException {