Groovy实现数组小数向下取整并统计唯一值数量
感谢aspok提供的帮助
问题背景
- 开发需求:将提取到的数值列表处理为
[3, 3, 4]格式后,统计列表内唯一值的总个数 - 实现逻辑:脚本读取输入JSON,提取所有
F4211_LNID字段值存入列表,初始提取结果为[3.1, 3.9, 4],需要对列表内所有数值做小数位向下取整处理 - 遇到的问题:最初尝试直接调用
Math.floor(intListItems)完成数组值向下取整,运行时抛出如下错误:
Exception No signature of method: static java.lang.Math.floor() is applicable for argument types: (ArrayList) values: [[3.1, 3.9, 4]] Possible solutions: floor(double), log(double), find(), macro(groovy.lang.Closure), acos(double), cos(double)
报错信息中可以看到正确提取的列表数据,但无法定位报错原因,也无法完成向下取整操作。
报错原因
java.lang.Math.floor()是针对单个双精度浮点数的取整方法,仅支持接收double类型入参,不能直接传入ArrayList类型的整个列表做批量处理,直接传列表就会触发上述参数不匹配的错误。
可正常运行的Groovy实现代码
// Read Input Values String aInputJson = aInputMap.InputJson ?: "{}" // Initialize Output Values def intListItems = [] def uniqueCount = 0 // Parse JSON def json = new JsonSlurper().parseText( aInputJson ) // Determine Row Numbers def rowset = json?.fs_DATABROWSE_F4211?.data?.gridData?.rowset // 遍历行集合,对每个F4211_LNID字段值单独做向下取整 intListItems = rowset.collect{ Math.floor(it.F4211_LNID) } // 对取整后的列表去重 intListItems.unique() // 统计唯一值总数 uniqueCount = intListItems.size()
测试使用的JSON数据
{ "fs_DATABROWSE_F4211": { "title": "Data Browser - F4211 [Sales Order Detail File]", "data": { "gridData": { "id": 58, "fullGridId": "58", "rowset": [ { "F4211_LNTY": "S", "F4211_CPNT": 0, "F4211_MCU": " 114000", "F4211_DSC2": "NAS133N3EK166", "F4211_NXTR": "580", "F4211_LNID": 3.1, "F4211_DOCO": 2845436 }, { "F4211_LNTY": "S", "F4211_CPNT": 0, "F4211_MCU": " 114000", "F4211_DSC2": "NAS133N3EK166", "F4211_NXTR": "580", "F4211_LNID": 3.9, "F4211_DOCO": 2845436 }, { "F4211_LNTY": "S", "F4211_CPNT": 0, "F4211_MCU": " 114000", "F4211_DSC2": "NAS133N3EK166", "F4211_NXTR": "580", "F4211_LNID": 4, "F4211_DOCO": 2845436 } ], "summary": { "records": 1, "moreRecords": false } } }, "errors": [], "warnings": [] }, "currentApp": "DATABROWSE_F4211", "timeStamp": "2000-06-01:09.42.02", "sysErrors": [] }
内容的提问来源于stack exchange,提问作者Flip7607
相关产品推荐
相关产品推荐

