簡體   English   中英

在字段中應用多個搜索

[英]Apply multiple search in fields

fun getMatchingContactsFromSearch(startDate: String?, endDate: String?, whereMet: String?, eventName: String?, product: String?, service: String?): Observable<List<String>> {
{
    if ((eventName!!.isNotEmpty()) && whereMet!!.isEmpty() && (startDate!!.isEmpty() && endDate!!.isEmpty())&& product!!.isEmpty()&& service!!.isEmpty()) {

    } else if ((whereMet!!.isNotEmpty()) && eventName!!.isEmpty() && (startDate!!.isEmpty() && endDate!!.isEmpty())&& product!!.isEmpty()&& service!!.isEmpty()) {

    } else if ((startDate!!.isNotEmpty() && endDate!!.isNotEmpty()) && eventName!!.isNotEmpty() && whereMet!!.isEmpty()&& product!!.isEmpty()&& service!!.isEmpty()) {

    } else if ((startDate!!.isNotEmpty() && endDate!!.isNotEmpty()) && eventName!!.isEmpty() && whereMet!!.isNotEmpty()&& product!!.isEmpty()&& service!!.isEmpty()) {

    } else if ((eventName!!.isNotEmpty() && whereMet!!.isNotEmpty()) && ((startDate!!.isEmpty() && endDate!!.isEmpty()))&& product!!.isEmpty()&& service!!.isEmpty()) {

    } else if (eventName!!.isEmpty() && whereMet!!.isEmpty() && (startDate!!.isNotEmpty() && endDate!!.isNotEmpty())&& product!!.isEmpty()&& service!!.isEmpty()) {

    } else if (eventName!!.isNotEmpty() && whereMet!!.isNotEmpty() && startDate!!.isNotEmpty() && endDate!!.isNotEmpty()&& product!!.isEmpty()&& service!!.isEmpty()) {

    } else  {

    }
}

這是我的多個項目的搜索代碼 我還有 2 個字段可以搜索,例如產品和服務 我也必須為此應用條件,但是將搜索條件應用到另外兩個字段似乎非常復雜 誰能建議我如何應用搜索條件對於另外兩個字段,或者給我一些其他方式,以便我們可以從 listOfData 中搜索。

您需要實現什么是一個簡單and標准(我假設你想and你的搜索語義。

我將向您展示這種方法適用於您的應用程序中的任何其他類似搜索。

想象一下你有一個類Data像這樣:

data class Data(val a: String? = null, val b: String? = null, val c: String? = null)

讓我們引入一個謂詞類型,它只是函數的別名:

typealias Predicate<T> = T.() -> Boolean

因此,檢查Data類的屬性a的謂詞可能如下所示:

val isASomething : Predicate<Data> = { a == "something" }
val data = Data(a = "something")
data.isASomething() // true

由於我們想要and語義,讓我們創建一個輔助函數,它將任意數量的謂詞與邏輯and組合在一起:

fun <T> and(vararg predicates: Predicate<T>): Predicate<T> {
  return predicates.fold({ true }) { previous: Predicate<T>, next: Predicate<T> ->
    {
      previous() && next()
    }
  }
}

綜上所述,您可以編寫一個方法,使用您的標准組件來搜索對象列表:

fun List<Data>.findByProps(aQuery: String? = null, bQuery: String? = null, cQuery: String? = null): List<Data> {

  val predicates = mutableListOf<Predicate<Data>>()
  if (aQuery != null) predicates += { a == aQuery }
  if (bQuery != null) predicates += { b == bQuery }
  if (cQuery != null) predicates += { c == cQuery }
  if (predicates.isEmpty()) throw IllegalArgumentException("At least one query must have a value")
  val criteria = and(*predicates.toTypedArray())
  return this.filter { it.criteria() }
}

讓我們測試一下:

val data = listOf(
    Data("a", "b", "c"),
    Data("a", "1", "2"),
    Data("a", "1", "c")
)
println(data.findByProps(aQuery = "a")) // [Data(a=a, b=b, c=c), Data(a=a, b=1, c=2), Data(a=a, b=1, c=c)]
println(data.findByProps(bQuery = "1")) // [Data(a=a, b=1, c=2), Data(a=a, b=1, c=c)]
println(data.findByProps(aQuery = "a", cQuery = "c")) // [Data(a=a, b=1, c=2), Data(a=a, b=1, c=c)]

您現在可以輕松地將這種方法應用於您的案例:

class Contact {
  ...
}

fun List<Contact>.search(startDateQuery: String? = null, endDateQuery: String? = null, whereMetQuery: String? = null, eventNameQuery: String? = null, productQuery: String? = null, serviceQuery: String? = null) {
      val predicates = mutableListOf<Predicate<Contact>>()
      if (startDateQuery != null) predicates += { startDate == startDateQuery }
      if (endDateQuery != null) predicates += { endDate == endDateQuery }
      if (whereMetQuery != null) predicates += { whereMet == whereMetQuery }
      if (eventNameQuery != null) predicates += { eventName == eventNameQuery }
      if (productQuery != null) predicates += { product == productQuery }
      if (serviceQuery != null) predicates += { service == serviceQuery }
      if (predicates.isEmpty()) throw IllegalArgumentException("At least one query must have a value")
      val criteria = and(*predicates.toTypedArray())
      return this.filter { it.criteria() }
}

並使用它:

val contacts : List<Contact> = getContacts()
val metAtHall = contacts.search(whereMetQuery = "Hall")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM