मैं कुछ वर्ग की एक सूची उत्पन्न करना चाहता हूं जिसमें कई फ़ील्ड हैं। उनमें से एक इंट टाइप है और इसे दोहराने की जरूरत नहीं है। क्या आप मुझे कोड लिखने में मदद कर सकते हैं?

मैंने आगे की कोशिश की:

  case class Person(name: String, age: Int)

  implicit val genPerson: Gen[Person] = 
    for {
    name <- arbitrary[String]
    age <- Gen.posNum[Int]
    } yield Person(name, age)

  implicit val genListOfPerson: Gen[scala.List[Person]] = Gen.listOfN(3, genPerson)

समस्या यह है कि मुझे एक समान उम्र के व्यक्ति का उदाहरण मिला है।

0
Vadim 22 जिंदा 2021, 15:31

2 जवाब

सबसे बढ़िया उत्तर

यदि आप चाहते हैं कि जेनरेट की गई सूची में किसी भी दो Person की आयु समान न हो, तो आप कर सकते हैं

implicit def IntsArb: Arbitrary[Int] = Arbitrary(Gen.choose[Int](0, Int.MaxValue))
implicit val StringArb: Arbitrary[String] = Arbitrary(Gen.listOfN(5, Gen.alphaChar).map(_.mkString))
implicit val PersonGen = Arbitrary(Gen.resultOf(Person.apply _))
implicit val PersonsGen: Arbitrary[List[Person]] =
  Arbitrary(Gen.listOfN(3, PersonGen.arbitrary).map { persons =>
    val grouped: Map[Int, List[Person]] = persons.groupBy(_.age)
    grouped.values.map(_.head) // safe because groupBy
  })

ध्यान दें कि यह बिना किसी डुप्लीकेट उम्र के List लौटाएगा, लेकिन इस बात की कोई गारंटी नहीं है कि सूची का आकार 3 होगा (यह गारंटी है कि सूची गैर-रिक्त होगी, जिसका आकार अधिकतम 3 होगा)।

यदि आकार 3 की सूची महत्वपूर्ण है, तो "पासा आपके खिलाफ" होने पर पीढ़ी के विफल होने के जोखिम पर, आपके पास कुछ ऐसा हो सकता है:

def uniqueAges(persons: List[Person], target: Int): Gen[List[Person]] = {
  val grouped: Map[Int, List[Person]] = persons.groupBy(_.age)
  val uniquelyAged = grouped.values.map(_.head)
  val n = uniquelyAged.size
  if (n == target) Gen.const(uniquelyAged)
  else {
    val existingAges = grouped.keySet
    val genPerson = PersonGen.arbitrary.retryUntil { p => !existingAges(p.age) }
    Gen.listOf(target - n, genPerson)
      .flatMap(l => uniqueAges(l, target - n))
      .map(_ ++ uniquelyAged)
  }
}

implicit val PersonsGen: Arbitrary[List[Person]] =
  Arbitrary(Gen.listOfN(3, PersonGen.arbitrary).flatMap(l => uniqueAges(l, 3)))
1
Levi Ramsey 22 जिंदा 2021, 19:04

आप इसे इस प्रकार कर सकते हैं:

implicit def IntsArb: Arbitrary[Int] = Arbitrary(Gen.choose[Int](0, Int.MaxValue))
implicit val StringArb: Arbitrary[String] = Arbitrary(Gen.listOfN(5, Gen.alphaChar).map(_.mkString))
implicit val PersonGen = Arbitrary(Gen.resultOf(Person.apply _))
implicit val PersonsGen: Arbitrary[List[Person]] = Arbitrary(Gen.listOfN(3, PersonGen.arbitrary))
0
Zvi Mints 22 जिंदा 2021, 15:36