Groovy将所有数组小数位向下舍入并返回唯一的数字计数?

pzfprimi  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(173)

谢谢你的帮助!
我的目标是让我的列表成为[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)
我在错误中看到了我的简化列表,但我无法将其向下舍入,并且不确定错误的含义。
(已更新)我的工作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

  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": []
}
vltsax25

vltsax251#

您会得到错误Exception No signature of method: static java.lang.Math.floor() is applicable for argument types: (ArrayList),因为没有接受List作为参数的Math.floor()版本。
相反,您需要对列表中的每一项单独调用Math.floor(),最简单的方法是在您已经在执行的collect { }调用中。

def flooredList = rowset.collect { Math.floor(it.F4211_LNID) }
assert flooredList == [3.0, 3.0, 4.0]

相关问题