无法删除scala列表中的空字符串

时间:2018-02-13 07:01:30

标签: scala list collections

为什么当我尝试删除列表中的空字符串时,这些操作都不起作用?

这是我的清单:

(yuhindmklwm00409219,958193628,0305delete,2700)
(yuhindmklwm00409219,958193628,0305delete,800)
(yuhindmklwm00409219,959262446,0219delete,62)
()
(yuhindmklwm00437293,752013801,0220delete,2700)
()
()
()
(yuhindmklwm00437293,85382,0126delete,500)
()
(yuhindmklwm00437293,863056514,0326delete,-2700)
(yuhindmklwm00437293,863056514,0326delete,2700)
()
()
()
()
()
(yuhindmklwm00437293,85258,0313delete,1000)
(yuhindmklwm00437293,85012,0311delete,1000)
(yuhindmklwm00437293,85718,0311delete,2700)
()
()
()
()
()
()
()
(yuhindmklwm00437293,744622574,0322delete,90)
(yuhindmklwm00437293,83704,0215delete,17)
()
()
(yuhindmklwm00437293,85253,0331delete,-2700)
(yuhindmklwm00437293,85253,0331delete,2700)
()
()
()
()
()
()
()
()
(yuhindmklwm00437293,752013801,0305delete,2700)
(yuhindmklwm00437293,33165,0315delete,1000)
(yuhindmklwm00437293,85018,0319delete,100)
(yuhindmklwm00437293,85018,0219delete,100)
(yuhindmklwm00437293,85018,0118delete,100)
(yuhindmklwm00437293,90265,0312delete,6)
(yuhindmklwm00437293,02465,0312delete,25)
(yuhindmklwm00437293,857164939,0313delete,15)
(yuhindmklwm00437293,22102,0313delete,4)
(yuhindmklwm00437293,55423,0313delete,100)
(yuhindmklwm00437293,02465,0314delete,1)
(yuhindmklwm00437293,90265,0312delete,1)
(yuhindmklwm00437293,93108,0315delete,25)
(yuhindmklwm00437293,220432304,0315delete,35)
(yuhindmklwm00437293,701211570,0315delete,35)
(yuhindmklwm00437293,28801,0315delete,10)
(yuhindmklwm00437293,93108,0211delete,3)
(yuhindmklwm00437293,93108,02)

这是列表的类型: List [String] = List((yuhindmklwm00437293,93108,02)..........))

我尝试过滤:

outputList1.filter(_.isNotNull).size

outputList1.map(record => if (record.size>3) record) else None)

这两种方法都无法删除空字符串。

列表的大小保持不变

2 个答案:

答案 0 :(得分:2)

你的第一种方法不起作用,因为正如jwvh所提到的,空字符串""不是null。您的代码只过滤掉空字符串。

您的第二种方法并未提供预期结果(即预期的结果长度),因为您要用None替换空记录。将列表中的某些项目替换为其他项目,但实际上不删除这些项目会导致列表大小相同。 Noneobject,可以是Option类型的值之一。

实现理想结果的一些方法是:

  1. outputList1.filter(_.nonEmpty) 很简单,过滤掉空字符串。

  2. outputList1.map(record => if (record.nonEmpty) Some(record)) else None).flatten 稍微复杂一点,这会将每个非空记录替换为Some(<record>),每个空字符串替换为None。结果列表[Option [String]](两种选项类型的SomeNone的混合)可以使用.flatten轻松展平。这将从Some中提取值,并从结果列表中删除None

    1. outputList1.collect(case record if (record.nonEmpty) => record)收集类似于地图的作品,期望在发生与其部分功能匹配错误的情况下不会抛出异常。

答案 1 :(得分:2)

  

outputList1.filter(_.isNotNull).size

没有这样的库方法isNotNull,如果这不是你想要的,因为空字符串与null不同。

除此之外,看起来你可能没有处理实际的空字符串。字符串"()"不为空。它有2个字符。试试outputList1.filter(_.length > 2)(或任何长度是你的实际限制)。

相关问题