【问题标题】:Unable to remove empty strings in scala list无法删除 scala 列表中的空字符串
【发布时间】:2018-07-23 11:45:09
【问题描述】:

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

这是我的清单:

(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)

这两种方法都无法删除空字符串。两者的列表大小保持不变

【问题讨论】:

  • outputList1.filter(_.nonEmpty) 一个空的String,即"",与null 不同,NoneString 的类型不同。
  • 嗨 @jwvh 我试过 null 对我不起作用,outputList1.filter(_ != null).size 给出相同的大小
  • 只是评论说null"" 不同,所以null 测试不会找到空字符串。
  • 是的,但我无法理解,即使这不起作用outputList1.map(record => if (record.size>3) record else None),因为我只是忽略任何小于 3 的字符串
  • NoneString 的类型不同。其结果将是 Strings(大于 3 个字符)和 Nones 的混合集合,这不是您想要的。试试filter(_.length > 3)

标签: scala list collections


【解决方案1】:

outputList1.filter(_.isNotNull).size

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

      1. outputList1.collect(case record if (record.nonEmpty) => record)collect 的工作原理类似于 map,希望它不会在它的部分函数匹配错误的情况下抛出异常。

    【讨论】:

    • 空字符串是字面意义上的()吗?如果是这种情况,请将record.nonEmpty 替换为record.length > 2
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多