2017-06-12 58 views
0

我想过滤三个对象列表并在一个循环中输出它们,我使用PlayFramework,并且我在后端运行了Java,我只在我的前端使用了Scala模板。在Play Framework模板中比较三个Scala列表

假设如下: 我得到了3列出了现在:AListBListCList 列表A和C没有什么共同点,但名单B是在中间的链接列表,谁充当连接。列表C包含具有两个属性的对象:idAidC。现在我想收到来自AList的所有对象,并且如果它的ID存在于BList中,我想要显示来自CList的其他信息。我真的不知道如何在scala中处理这个问题。我读了一些关于线程荏苒名单一起,像这样的做法提出了:

@listCheckA = @{ 
    AList.map(a => (a, BList.map(_.idA).contains(a.idA))) 
} 
@listCheckC = @{ 
    CList.map(c => (c, BList.map(_.idC).contains(c.idC))) 
} 
@listLinked = @{ 
    listCheckA.zip(listCheckC).map(???) 
} 

后来我想输出与for循环的对象。 如果这可能是一个合法的方法,我应该在列表链接检查我的条件?

对不起,如果这个问题听起来很愚蠢,我很少使用Scala。

在此先感谢!

+0

是'C'还是'B'有'idA'和'idC'? –

+0

@CyrilleCorpet再次感谢您的帮助,我决定在这一个上创建一个新的线程 - 但它是相同的主题。 'B'对象包含'idA'和'idC'。和'C'对象只包含'idC'。 “BList”只作为链接列表。对象'b'仅用于确定哪个'C'对象属于哪个'A'对象。该方法非常复杂,但它是一个预定义的数据库,我正在使用,并且我必须创建一种方法来连接这些表/列表。 “BList”中的对象是手动创建的。 –

+0

你不能加入你的数据库管理系统吗? –

回答

1

首先,这看起来很像一个多到可以链接表,你应该能够使用DB库来处理,像

SELECT a.*, c.* FROM TableA as a, TableB as b, TableC as c WHERE a.idA = b.idA AND c.idC = b.idC` 

如果你真的需要这样做使用Scala的(正如我在以前的跟帖说,逻辑不应该在模板中,而是在你的控制器),你可以做到这一点作为对理解:

@for { 
    a <- AList 
    b <- BList if b.aid == a.aid 
    c <- CList if c.cid == b.cid 
} { 
    // ... do whatever you want with a and b and c here ... 
} 

这是相同的三个for环内除了if声明之外会做它所说的(满足谓词的过滤元素)。

除非使用上面的SQL语句直接在数据库中查询,否则您会发现很难更有效地完成此操作。

+0

这绝对有道理,并感谢您提供的SQL解决方案。我想试试这两种解决方案,看看scala循环是否对这个数据量有一个可接受的性能(可能不是,对方内部的三个'for'循环听起来不像最好的性能)。 不知何故在你的例子中的语法不适合我。它表示“对于'声明'中的”预计的统计员“。很抱歉,如果有人熟悉scala,那么解决方案可能很明显......我感觉非常愚蠢。尽管如此,感谢您的耐心。 –

相关问题