如何使用 Groovy 找到两个列表的交集?

How to Use Groovy to find the INTERSECTION of two lists?

我正在尝试使用 Groovy 检索两个列表中的共同项。以下代码工作正常,即 运行 此代码的输出是“在常见项目中发现的 DEBUG:相同”。到目前为止一切顺利!

def list1 = ["same", "different"]
def list2 = ["same", "not the same"] 

def commonItems = list1.intersect(list2)

for(int i=0; i < commonItems.size(); i++)
{
    log.info("DEBUG found in common Items : " + commonItems[i])
}

当我尝试将上述原则应用于对象列表时遇到问题 - 我的问题是 'commonItems' 列表不包含我期望的单个对象,而是空的。请注意,我的自定义对象 'ErrorWarningDetail' 确实覆盖了 compareTo。有人可以看到我做错了什么/提出任何建议吗?提前致谢!

首先这是我的自定义 class - 注意 'CompateTo' 现在只检查 'Code' 字段。

class ErrorWarningDetail implements Comparable
{
    public String Code
    public String Description
    public String ErrorType
    public String State  

    @Override
    int compareTo(Object o) {
        int result = Code <=> o.Code
        result
    }
}

下面是执行该业务的代码。我希望一个对象在 'commonItems' 中,但它实际上是空的 - 我在这里做错了什么? 运行 的输出是“DEBUG no common items”

def similarONE = new ErrorWarningDetail()
similarONE.Code = "100-1"
def similarTWO =new ErrorWarningDetail()
similarTWO.Code = "100-1"
def completelyDifferent = new ErrorWarningDetail()
completelyDifferent.Code = "697-2"

def List1 = []
def List2 = []
List1.add(similarONE)
List1.add(completelyDifferent)
List2.add(similarTwo)

def commonItems = list1.intersect(list2)

if (commonItems.size() == 0)
{
    log.info("DEBUG no common items")   
}


在 Java 中实施 compareTo() 是不够的,您应该实施 equals/hashCode。

在 Groovy 中有一个方便的注释。因此,下面的脚本成功执行:

import groovy.transform.EqualsAndHashCode
  
@EqualsAndHashCode( includes = [ 'code' ] )
class ErrorWarningDetail implements Comparable {
      String code
      String description
      String errorType
      String state
  
      @Override
      int compareTo(Object o) {
          code <=> ( o?.code ?: '' )
      }
}
  
def similarONE = new ErrorWarningDetail( code:"100-1" )
def similarTWO = new ErrorWarningDetail( code:"100-1" )
def completelyDifferent = new ErrorWarningDetail( code:"697-2" )

def list1 = [similarONE, completelyDifferent]
def list2 = [similarTWO]

def commonItems = list1.intersect list2

assert 1 == commonItems.size()

P.S。请不要命名以大写字母开头的字段!

equalshashCode 是用于确定对象相等性的方法,因此 intersect 方法将依赖于它们。

compareTo 方法用于排序目的。

Groovy 在包 groovy.transform

中有一些用于常见任务的方便实用程序

下面是经过修改的 class,带有使其按预期工作的注释。

@EqualsAndHashCode(includes=["Code"])
@ToString(includeFields=true)
class ErrorWarningDetail implements Comparable
{
    String Code
    String Description
    String ErrorType
    String State  

    @Override
    int compareTo(Object o) {
        Code <=> o?.Code
    }
}