我必须编写一个SUM()方法,它可以获得Number对象数组(Java)。所以它可能是几个短对象,然后是几个浮点,然后是一个bigdecimal。
如果所有内容都是byte/short/integer/long,那么返回的值应该是long。
目前,我收集了long(全部byte/short/integer/long)、double(全部float/double)和bigdecimal的运行总数。然后在最后添加到任何一个已经被使用(我有2个布尔跟踪),并返回。
它很管用,但不干净。有更简单的方法吗?添加两个Number对象并返回适当的Number对象的方法?
没有很好的方法来做到这一点,但您可以将其分解成许多更小、更简单的方法。我的方法是建立类型的层次结构。理想情况下,添加只涉及级别较低的类型。一旦确定了要进行加法的适当级别,就可以调用适当的方法。以下是我的代码(未测试)。
private static final Map<Class<? extends Number>, Integer> RANKS;
static {
Map<Class<? extends Number>, Integer> map = new IdentityHashMap<>();
map.put(Byte.class, 0);
map.put(Short.class, 1);
map.put(Integer.class, 2);
map.put(Long.class, 3);
map.put(BigInteger.class, 4);
map.put(Float.class, 5);
map.put(Double.class, 6);
map.put(BigDecimal.class, 7);
RANKS = Collections.unmodifiableMap(map);
}
private static Number addBytes(Number... numbers) {
byte a = 0;
for (Number number : numbers)
a += number.byteValue();
return a;
}
private static Number addShorts(Number... numbers) {
short a = 0;
for (Number number : numbers)
a += number.shortValue();
return a;
}
private static Number addInts(Number... numbers) {
int a = 0;
for (Number number : numbers)
a += number.intValue();
return a;
}
private static Number addLongs(Number... numbers) {
long a = 0;
for (Number number : numbers)
a += number.longValue();
return a;
}
private static Number addBigIntegers(Number... numbers) {
BigInteger a = BigInteger.ZERO;
for (Number number : numbers)
a = a.add(number instanceof BigInteger ? (BigInteger) number : BigInteger.valueOf(number.longValue()));
return a;
}
private static Number addFloats(Number... numbers) {
float a = 0;
for (Number number : numbers)
a += number.floatValue();
return a;
}
private static Number addDoubles(Number... numbers) {
double a = 0;
for (Number number : numbers)
a += number.doubleValue();
return a;
}
private static Number addBigDecimals(Number... numbers) {
BigDecimal a = BigDecimal.ZERO;
for (Number number : numbers) {
a = a.add(
number instanceof BigDecimal ? (BigDecimal) number
: number instanceof BigInteger ? new BigDecimal((BigInteger) number)
: new BigDecimal(number.doubleValue()));
}
return a;
}
public static Number add(Number... numbers) {
if (numbers.length == 0)
return 0;
int max = -1;
for (Number number : numbers) {
Integer rank = RANKS.get(number.getClass());
if (rank == null)
throw new IllegalArgumentException();
max = Math.max(max, rank);
}
switch (max) {
case 0: return addBytes(numbers);
case 1: return addShorts(numbers);
case 2: return addInts(numbers);
case 3: return addLongs(numbers);
case 4: return addBigIntegers(numbers);
case 5: return addFloats(numbers);
case 6: return addDoubles(numbers);
case 7: return addBigDecimals(numbers);
default: throw new IllegalStateException();
}
}
我正在构建/训练Tesseract从捕获的照片中识别护照MRZ代码。在将照片/图像发送到Tesseract引擎之前,我将应用以下图像预处理技术: 二值化 正常化 取样 去噪 细化(可选) 此外,我已经用正确的字体(OCR-B)训练了Tesseract引擎,方法是创建大量的框文件(来自大约35个示例,其中包含从OCR-B字体的文本示例中获取的照片),修复框文件中的任何错误,创建训练文件,最后用我的所
问题内容: 我已经多次重温了这个问题,但我从未真正找到合适的答案。 是否可以执行MySQL搜索,以按相关性返回ACTUAL准确排序的结果? 我试图创建一个ajax搜索表单,当用户在输入字段中键入内容时提出建议,并且仅使用纯MySQL查询还没有找到合适的解决方案。我知道有可用的搜索服务器,例如ElasticSearch,我想知道如何仅使用原始MySQL查询来实现。 我有一张学校科目表。少于1200行
问题内容: 我有问题,请查看我的数据库: 我想收到这样的信息(按投票顺序,从最高到最低): 您能帮我写正确的SQL查询吗? 问题答案:
问题内容: 我创建了一个过滤器来监视请求的长度。 我现在如何获得毫秒数? 问题答案: 1微秒= 1000纳秒 1毫秒= 1000微秒 请注意,结果会四舍五入,但是无论如何您通常都无法获得真正的纳秒精度(准确性取决于操作系统)。从Javadoc开始: 此方法提供纳秒精度,但不一定提供纳秒精度。
我有一个对象的数组,正在寻找使用es6根据material_id对它们进行分组的最有效的方法 所以最后我想得到 我已经检查了这个问题,但它似乎没有显示出分组
假设我们有这样一段话: Lorem ipsum dolor坐在那里,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭,圣职献祭在有限的条件下,在有限的条件下,在有限的条件下进行锻炼。杜伊斯奥特鲁尔杜洛在谴责在波罗的海韦尔特埃塞西莱