【问题标题】:Overloaded method filter重载方法过滤器
【发布时间】:2021-07-18 15:13:31
【问题描述】:

我有一个练习,我必须找到不在集合中的第一个 >=0 元素。 我的计划是首先:filter 集合中的负数,然后通过sliding 配对,然后将difference 添加到元组中(如果它是 1,我知道没有任何 Int 元素这不在它们之间的集合中)。然后我想过滤掉那些,那个差异不是 1 - 所以我知道我正在搜索的元素是例如

Set(-3,0,1,2,4),我有元组(0,1),(1,2),(2,4) --> 过滤出来的最后只有(2,4, 2 (difference)),所以我的元素是2+1 = 3

当我尝试filter 找出有差异的那些!= 1 时,它说它无法解析重载方法filter

def minNotContained(set: Set[Int]): Int = {
   val positive = set.filter(_ >= 0)
   val pairs = positive.sliding(2).toList.map(_.toList)
   val pairsWithDifference = pairs.map{case List(a: Int,b: Int) => List((a,b,b-a))}.filter((x,y,z) => z!=1)
  

 }

【问题讨论】:

  • 如果您的代码直接使用元组而不是将它们包装在列表中,它会变得更加容易。另请注意,迭代集合中的元素不一定是排序的
  • 在我的练习中,我假设集合是有序的。那么我该如何处理元组呢?我真的不知道为什么它(filter)在我写(x,y,z) => z != 1 时不想工作.....
  • 如果您使用.filter { case List((x,y,z)) => z!=1},您的过滤器将起作用
  • 好的,不可能这样做 - 它在val pairs HashSet 中生成,它不会一个一个地获取元素,而是结合,例如(0,4) 而不是 (0,1)

标签: scala functional-programming


【解决方案1】:

使用dropWhile() 作为您的过滤器。

val setOfInts = Set(....)
val result = LazyList.from(0).dropWhile(setOfInts).head

【讨论】:

    【解决方案2】:

    我设法做到了这一点,但事实并非如此......我需要使用集合上的操作来做这个练习,很抱歉回答我的问题,但我希望我的解决方案能更好地被看到。

    
    def minNotContained(set: Set[Int]): Int = {
        val positive = set.filter(_ >= 0)
        @tailrec def isInSet(collection: Set[Int], number: Int): Int = {
          if (collection.contains(number)) isInSet(collection, number+1) else number
        }
        isInSet(set,0)
        
      }
      println(minNotContained(Set(-3,0,1,2,4,5,6)))
    
    

    【讨论】:

      猜你喜欢
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2019-03-26
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多