我的布局中:
如果允许使用小数列跨度,这将很简单(将每个权重乘以列数,再除以总权重),但是将其分解为整数会更加困难。这是我想出的:
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(就地修改数组)该函数的工作方式如下:
weightedValues
的最大值中减去1,直到weightedValues
的总和小于或等于total
(考虑到四舍五入的任何0.5对)< / li>
此功能有两个主要问题:
totalValues
和subtractOneFromHighest
都必须遍历函数主循环中的数组)为说明第(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]
。
我的问题如下:
答案 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 {