【问题标题】:How to check if an argument of an object is in an ArrayBuffer filled with objects in Scala?如何检查对象的参数是否在 ArrayBuffer 中填充了 Scala 中的对象?
【发布时间】:2019-01-11 11:52:02
【问题描述】:

我想检查用户键入的 Int 是否作为主要参数/变量(该类只有一个 Int 类型的参数)存在于填充类对象的 ArrayBuffer 中。

这是学校的作业,我无法获得教授或助理的帮助,所以我请求您的帮助。我必须编写一个类“ewallet”,它具有“client id”(Int)和“pin code”(两个数字之间的随机 Int)等属性。我没有使用“pin 码”作为类的参数,因为它似乎暗示在分配中,因为它说“当用户使用他的客户 ID 创建帐户时,它必须显示通行证”。我不应该能够创建 2 个具有相同客户端 ID 的电子钱包。

因此,如果存储电子钱包的 ArrayBuffer(或数组)中已经存在具有相同客户端 ID 的电子钱包,我将不得不拒绝创建电子钱包。

由于随机生成的“密码”,它创建了具有相同客户端ID和不同密码的不同电子钱包。那么如果已经存在具有某些参数的电子钱包,如何不将电子钱包(类)添加到列表中呢?

感谢您帮助新手。

我可以创建另一个数组列表来保存用户输入的客户端 ID,并将它们保存以与未来的客户端 ID 进行比较。但我想学习如何处理包含对象的数组。 我尝试使用 for (i

class ewallet(clientID: Int){
  val id = clientID
  val pass = 100 + Random.nextInt((99999-100)+1)   //for the class, I didnt include the rest as its not related.

//for the main
  def main(args: Array[String]): Unit = {
    var ListClients = ArrayBuffer[ewallet]()
    var action: Char = " ".charAt(0)  
    do {
      println("[c]-Create ewallet. \n[a]-Access ewallet.\n[q]-Quit")

      action = StdIn.readChar()

      if (action == 'c') {
        val NumClient = StdIn.readLine("Enter your client id :").toInt
        var newClient = new ewallet(NumClient)

        for (i <- ListClients) if (NumClient == i.id) {          
          println("Impossible, already exists.")
        }

        for (i <- ListClients) if (NumClient != i.id){
          ListClients += newClient
          println("Your pin code is : " + newClient.pass)
        }
      }
      println(ListClients.mkString("\n"))
    } while(action != 'q')

如果 NumClient != i.id,我应该能够将 newClient 添加到 ListClients,但是因为它最初是空的,所以它不会读取这些行……所以它什么都不做。

【问题讨论】:

    标签: scala


    【解决方案1】:

    最简单的方法是将存在检查的结果分配给一个变量,然后根据该变量添加或“不添加”客户端对象。在 Scala 中,使用集合的惯用方式是其丰富的转换方法集;在您的情况下,exists 提供了解决方案:

    val alreadyExists = ListClients.exists(_.id == NumClient)
    if (alreadyExists) {
      println("Impossible, already exists.")
    } else {
      ListClients += newClient
      println("Your pin code is : " + newClient.pass)
    }
    

    如果你还不了解集合转换和一般的高阶函数(你应该知道!它们让生活变得更轻松),那么上面的部分实际上等价于:

    var alreadyExists = false
    for (i <- ListClients) {
      alreadyExists = alreadyExists || i.id == NumClient
    }
    

    (虽然效率更高一点,因为它会在找到现有客户端后立即停止迭代,如果它存在的话)。

    作为一个不相关的注释,在 Scala 中,习惯上在 pascalCase 中命名变量并在 CamelCase 中键入。因此,您的类应该被称为EWallet,而像ListClients 这样的变量应该被称为listClients。此外," ".charAt(0)' ' 相同。

    【讨论】:

    • 非常感谢!我没有想到以这种方式使用存在(我试过了,我不知道如何访问 id 然后将其与 NumClient 进行比较)所以你是说我应该使用上面的 eventho 下面的一个更有效吗?我将开始使用传统的方式来命名变量:)
    • 不,恰恰相反。 exists 效率更高,因为下面的循环总是遍历整个列表,而 exists 在找到匹配项后立即终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多