【问题标题】:Filter on a nested structure in Scala在 Scala 中过滤嵌套结构
【发布时间】:2015-07-21 09:25:18
【问题描述】:

我在 scala 中有一个嵌套结构,我想过滤这个结构,但不知道该怎么做: 主要结构是

currentCustStory = new CustStory(custEvent.custId, custEvent.eventType, custEvent.eventTime.toLong, currentEventStory)
currentEventStory = new mutable.MutableList[StoryEvent]

storyEvent 有 4 个属性。

我想从currenteventstory(属于currentcustStory 的列表)中过滤一些元素,并使用通过过滤器的Story 事件的元素创建一个新的currentcustStory

有人知道我该怎么做吗? p.s:我是 Scala 的新手

【问题讨论】:

    标签: list scala filter


    【解决方案1】:

    可以这样做:

    val newCurrentEventStory = currentCustStory.currentEventStory.filter(func(x) => Boolean)
    val newCustStory = new CustStory(custEvent.custId, custEvent.eventType, custEvent.eventTime.toLong, newCurrentEventStory)
    

    你必须弄清楚 func(x) 应该是什么,但它是一个接受一个 StoryEvent 参数并返回 true 或 false 的函数。从技术上讲,它的类型是:

    func(storyEvent: StoryEvent):Boolean
    

    根据您提供的最新信息,我认为最好使用 for comphresion 进行过滤,因为它使代码更易于理解、调试和修改。这是一个实现,假设 currentCustStory.currentEventStory 的第一个元素在其距离

    val newCurrentEventStory = new MutableList[StoryEvent]()
    val ces = currentCustStory.currentEventStory
    var p = false // records if previous element passed
    
    // filter currentCustStory.currentEventStory and build newCurrentEventStory
    for (i <- 0 to (ces.length - 1)) {
      if (i == 0) {
        if (ces(0).distance < 60) {
          p = true
          newCurrentEventStory += ces(0)
        } else p = false
      }
      if (p == true) {
        if (ces(i).distance < 60 || ces(i - 1).TimeFromRoot < 90) {
          p = true
          newCurrentEventStory += ces(i)
        } else p = false
      }
    }
    
    val newCustStory = new CustStory(custEvent.custId, custEvent.eventType, custEvent.eventTime.toLong, newCurrentEventStory)
    

    【讨论】:

    • 在我的过滤功能中,我需要获取整个列表。基本上,我根据两个条件标记列表的每个成员:[a) 如果 currentEventstory(i-1) 通过过滤器,currentEventStory(i) 也可以通过过滤器 if currentEventstory(i).distnace
    • 这意味着每个 currentEventstory(i) 评估都依赖于之前的成员评估结果,有没有办法实现这个嵌套的依赖过滤器?还是将整个列表传递给过滤函数?
    • 为了根据前一个元素评估列表元素,一种方法是压缩列表,其尾部给出一个元组列表,例如 List(1,2,3).zip(List(1 ,2,3).tail) == List((1,2), (2,3)),那么你可以过滤这样的元组,在你的情况下是这样的形式 (currentEventstory(i-1), currentEventstory(i ))。您决定 currentEventstory(0) 是否应该通过的方法是什么?
    • 所以我试图按照你的方式实现它,但它给了我一个空指针异常
    • 它与 Scala 惰性求值有关。我想这样该对象还没有被构造,但我试图使用它。现在我的 custStory 类中有一个函数,我这样称呼它:var windowedRDD2 = windowedRDD.filter(r => r != null).map(a=>a.churnPeriod(isInChurnPeriod,isInChurnMode)) 当 windowrdd 是一个 rdd 的保管人。但是,这也不起作用,在流失期课程中,我试图为每个 custStory 更改事件故事。但它不起作用
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2019-10-16
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多