Groovy 向下舍入所有数组小数位和 return 唯一数字计数?

Groovy to round all array decimal places down and return unique number count?

感谢您的帮助!

我的目标是让我的列表成为 [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": []
}

您收到错误 Exception No signature of method: static java.lang.Math.floor() is applicable for argument types: (ArrayList),因为 Math.floor() 没有接受列表作为参数的版本。

相反,您需要对列表中的每个项目调用 Math.floor()。最简单的方法是在您已经在进行的 collect { } 调用中。

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