Scala ตรวจสอบว่ามีองค์ประกอบอยู่ในรายการหรือไม่


87

ฉันต้องการตรวจสอบว่ามีสตริงอยู่ในรายการหรือไม่และเรียกใช้ฟังก์ชันที่รับบูลีนตามนั้น

เป็นไปได้ไหมที่จะทำสิ่งนี้ด้วยซับเดียว?

รหัสด้านล่างนี้ดีที่สุดที่ฉันจะได้รับ:

val strings = List("a", "b", "c")
val myString = "a"

strings.find(x=>x == myString) match {
  case Some(_) => myFunction(true)
  case None => myFunction(false)
}

ฉันแน่ใจว่าเป็นไปได้ที่จะทำสิ่งนี้โดยใช้การเข้ารหัสน้อยลง แต่ฉันไม่รู้วิธี!

คำตอบ:


124

เพียงแค่ใช้ contains

myFunction(strings.contains(myString))

3
จะเกิดอะไรขึ้นถ้าฉันไม่ได้จัดการกับสตริง แต่ฉันต้องตรวจสอบว่าค่านั้นตรงกับจำนวนที่เป็นไปได้หรือไม่?
tutuca

2
@tutuca, ตรวจสอบการตรวจสอบถ้าค่าในรายการเป็นส่วนหนึ่งของสตริง
Om Prakash

33

และถ้าคุณไม่ต้องการใช้ความเท่าเทียมกันอย่างเข้มงวดคุณสามารถใช้มีอยู่:


myFunction(strings.exists { x => customPredicate(x) })

14

ง่ายยิ่งขึ้น!

strings contains myString

4
ต่างจากคำตอบที่ยอมรับอย่างไร?
Alper t. Turker

2
โดยพื้นฐานแล้วมันเหมือนกัน แต่ความแตกต่างคือ 1. วงเล็บน้อยลง 2. ช่วงเวลาน้อยลง 3. ไม่มีการอ้างอิงถึง myFunction 4. มีช่องว่างมากขึ้น โดยรวม; คำตอบของฉัน = 25 ตัวอักษรเทียบกับคำตอบที่ยอมรับ = 38 ตัวอักษร
Taylrl

มันเป็นคำถามสำนวน;) เพื่อให้คุณบริบทผมได้ที่นี่จากLQP ฉันไม่แนะนำให้ลบ แต่ถ้าคุณโพสต์คำตอบช้าลองระบุมูลค่าเพิ่มเติม น้ำตาลวากยสัมพันธ์เล็กน้อยที่ไม่รู้สึกว่าเป็นเช่นนั้นคุณก็รู้ แค่บอกว่า ...
Alper t. Turker

3
ไม่มีปัญหา. ฉันเข้าใจ. ฉันคิดว่ามันเพิ่มมูลค่าโดยการแสดงความเรียบง่ายที่เพิ่มขึ้น ยังไงก็ขอบคุณ :)
Taylrl

3

สิ่งนี้ควรใช้ได้กับเพรดิเคตที่แตกต่างกัน

myFunction(strings.find( _ == mystring ).isDefined)

3
คุณสามารถใช้มีอยู่แทนที่จะต้องใช้การค้นหารวมกับ isDefined
Ciaran0

2

ในกรณีของคุณฉันจะพิจารณาใช้ Set ไม่ใช่ List เพื่อให้แน่ใจว่าคุณมีค่าที่ไม่ซ้ำกันเท่านั้น เว้นแต่บางครั้งคุณจำเป็นต้องรวมรายการที่ซ้ำกัน

ในกรณีนี้คุณไม่จำเป็นต้องเพิ่มฟังก์ชัน Wrapper รอบรายการ


-3

คุณยังสามารถใช้containsวิธีการได้อีกด้วยfoldLeftมันยอดเยี่ยมมาก ฉันชอบอัลกอริทึมของ foldLeft

ตัวอย่างเช่น:

object ContainsWithFoldLeft extends App {

  val list = (0 to 10).toList
  println(contains(list, 10)) //true
  println(contains(list, 11)) //false

  def contains[A](list: List[A], item: A): Boolean = {
    list.foldLeft(false)((r, c) => c.equals(item) || r)
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.