Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 将对象的多个字段与对象的ArrayList中的字段进行比较_Kotlin_Arraylist_Filter - Fatal编程技术网

Kotlin 将对象的多个字段与对象的ArrayList中的字段进行比较

Kotlin 将对象的多个字段与对象的ArrayList中的字段进行比较,kotlin,arraylist,filter,Kotlin,Arraylist,Filter,我创建了一个“SiteObject”,其中包括以下字段: data class SiteObject( //Site entry fields (10 fields) var siteReference: String = "", var siteAddress: String = "", var sitePhoneNumber: String = "", var siteEmail: Stri

我创建了一个“SiteObject”,其中包括以下字段:

data class SiteObject(

    //Site entry fields (10 fields)
    var siteReference: String = "",
    var siteAddress: String = "",
    var sitePhoneNumber: String = "",
    var siteEmail: String = "",
    var invoiceAddress: String = "",
    var invoicePhoneNumber: String = "",
    var invoiceEmail: String = "",
    var website: String = "",
    var companyNumber: String = "",
    var vatNumber: String = "",
) 
我想通过检查列表中对象的任何字段是否与特定
中的字段匹配来过滤
数组列表(称之为所有站点

例如,我知道如何通过查看一个字段进行筛选:

    fun checkIfExistingSite(currentSite: SiteObject) : ArrayList<SiteObject> {
        var matchingSites = ArrayList<SiteObject>()
        allSites.value?.filter { site ->
            site.siteReference.contains(currentSite.siteReference)}?.let { matchingSites.addAll(it)
        }
        return matchingSites
    }
fun checkiExistingSite(当前站点:SiteObject):ArrayList{
var matchingSites=ArrayList()
allSites.value?.filter{site->
site.siteReference.contains(currentSite.siteReference)}?.let{matchingSites.addAll(it)
}
返回匹配站点
}
但我正在寻找一种优雅的方法来创建一个列表,在该列表中,我将allSites中每个对象中的匹配字段与currentSite中相应的字段进行比较


这将为我提供一个站点列表,这些站点可能相同(允许用户输入数据的方式不同),我可以提供给用户进行检查。

使用等于数据类的属性:

val matchingSites: List<SiteObject> = allSites
    .filterNotNull()
    .filter { it.equals(currentSite) }
val matchingSites:List=allSites
.filterNotNull()
.filter{it.equals(currentSite)}

如果您要寻找比所有字段值完全匹配更宽松的相等性标准,我建议使用(注意,这种方法可能会有性能损失):

val memberProperties=SiteObject::class.memberProperties
val minMatchingProperties=9//或在您的案例中有意义的任何数字
val matchingItems=allSites.filter{
memberProperties.atLeast(minMatchingProperties){property->property.get(it)==property.get(currentSite)}
}
至少(n:Int,谓词:(E)->布尔):布尔{
val size=count()
何时返回{
n==1->this.any(谓词)
n==size->this.all(谓词)
n>size-n+1->this.atLeast(size-n+1){!predicate.invoke(it)}
其他->{
变量计数=0
对于(本文件中的元素){
if(谓词调用(元素))计数++
如果(计数>=n)返回true
}
返回错误
}
}
}

您可以在筛选器谓词中指定要与当前站点匹配的所有字段:

fun checkiExistingSite(当前站点:SiteObject)=
allSites.filter{
it.siteAddress==currentSite.siteAddress
||it.sitePhoneNumber==currentSite.sitePhoneNumber
||it.siteReference==currentSite.siteReference
}
由于短路,解决时间长但速度快。
如果列表可为空,则可以将其转换为不可为空的列表,如:

allSites?过滤器{…}.orEmpty()
//还是我更好
allSites.orEmpty().filter{…}

Ah,谢谢Hamza-但这是比较任何字段匹配的对象还是仅当所有字段匹配时才匹配?如果是后者,那不是我要找的….?是的。这是给所有人的。理想的解决方案是在SiteObject中创建一个自定义比较函数,并在filter中使用它,而不是“equals”。