Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用Scala检测不可打印字符的字符串中的索引_String_Scala - Fatal编程技术网

String 使用Scala检测不可打印字符的字符串中的索引

String 使用Scala检测不可打印字符的字符串中的索引,string,scala,String,Scala,我有一个方法可以检测字符串中不可打印的索引,如下所示 def isPrintable(v:Char) = v >= 0x20 && v <= 0x7E val ba = List[Byte](33,33,0,0,0) ba.zipWithIndex.filter { v => !isPrintable(v._1.toChar) } map {v => v._2} > res115: List[Int] = List(2, 3, 4) def可打印(

我有一个方法可以检测字符串中不可打印的索引,如下所示

def isPrintable(v:Char) = v >= 0x20 && v <= 0x7E
val ba = List[Byte](33,33,0,0,0)
ba.zipWithIndex.filter { v => !isPrintable(v._1.toChar) } map {v => v._2}
> res115: List[Int] = List(2, 3, 4)
def可打印(v:Char)=v>=0x20&&v!可打印(v._1.toChar)}map{v=>v._2}
>res115:List[Int]=List(2,3,4)

结果列表的第一个元素是索引,但我想知道是否有更简单的方法来实现这一点

仅获取满足给定条件的第一个索引:

ba.indexWhere(v => !isPrintable(v.toChar))

(如果未找到任何内容,则返回-1)

仅获取满足给定条件的第一个索引:

ba.indexWhere(v => !isPrintable(v.toChar))

(如果未找到任何字符,则返回-1)

如果需要第一个不可打印字符(如果存在)的
选项[Int]
,则可以执行以下操作:

ba.zipWithIndex.collectFirst{
  case (char, index) if (!isPrintable(char.toChar)) => index
}
> res4: Option[Int] = Some(2)

如果您想要示例中的所有索引,只需使用
collect
而不是
collectFirst
,您将得到一个
列表

如果您想要第一个不可打印字符(如果存在)的
选项[Int]
,您可以执行以下操作:

ba.zipWithIndex.collectFirst{
  case (char, index) if (!isPrintable(char.toChar)) => index
}
> res4: Option[Int] = Some(2)

如果您想要像您的示例中那样的所有索引,只需使用
collect
而不是
collectFirst
,您将得到一个
列表

,如果需要,只会返回第一次出现的不可打印字符

方法
span
应用于
列表
可提供两个子列表,第一个子列表中所有元素都持有一个条件,第二个子列表以伪造条件的元素开始。在这种情况下考虑,

val (l,r) = ba.span(b => isPrintable(b.toChar))
l: List(33, 33)
r: List(0, 0, 0)
要获取第一个不可打印字符的索引

l.size
res: Int = 2

如果需要,所有出现的不可打印字符

考虑给定
列表
分区
作为标准。比如说,

val ba2 = List[Byte](33,33,0,33,33)  

val (l,r) = ba2.zipWithIndex.partition(b => isPrintable(b._1.toChar))
l: List((33,0), (33,1), (33,3), (33,4))
r: List((0,2))

其中,
r
包括具有不可打印字符的元组,以及它们在原始
列表中的位置,如果需要,只包括第一次出现的不可打印字符

方法
span
应用于
列表
可提供两个子列表,第一个子列表中所有元素都持有一个条件,第二个子列表以伪造条件的元素开始。在这种情况下考虑,

val (l,r) = ba.span(b => isPrintable(b.toChar))
l: List(33, 33)
r: List(0, 0, 0)
要获取第一个不可打印字符的索引

l.size
res: Int = 2

如果需要,所有出现的不可打印字符

考虑给定
列表
分区
作为标准。比如说,

val ba2 = List[Byte](33,33,0,33,33)  

val (l,r) = ba2.zipWithIndex.partition(b => isPrintable(b._1.toChar))
l: List((33,0), (33,1), (33,3), (33,4))
r: List((0,2))

其中,
r
包括带有不可打印字符的元组及其在原始
列表中的位置

我不确定是否需要索引列表或元组列表,也不确定“ba”是否需要字节列表或以字符串开头

 for {  i <- 0 until ba.length if !isPrintable(ba(i).toChar) } yield i

我不确定是否需要索引或元组列表,也不确定“ba”是否需要字节列表或以字符串开头

 for {  i <- 0 until ba.length if !isPrintable(ba(i).toChar) } yield i

您可以直接使用regexp通过unicode代码点查找无法打印的字符

资源:

通过这种方式,您可以直接使用这种模式筛选字符串,例如:

val text = "this is \n sparta\t\r\n!!!"
text.zipWithIndex.filter(_._1.matches("\\p{C}")).map(_._2)
> res3: Vector(8, 16, 17, 18)

结果,您将得到字符串中所有不可打印字符的索引向量。查看它

您可以直接使用regexp通过unicode代码点查找不可打印的字符

资源:

通过这种方式,您可以直接使用这种模式筛选字符串,例如:

val text = "this is \n sparta\t\r\n!!!"
text.zipWithIndex.filter(_._1.matches("\\p{C}")).map(_._2)
> res3: Vector(8, 16, 17, 18)

结果,您将得到字符串中所有不可打印字符的索引向量。检查它

这不是只返回一个索引吗?如果我没记错的话,停下来看第一个发现。我以为OP意味着得到第一个索引?我想他想要所有的:
>res115:List[Int]=List(2,3,4)
他说“结果列表的第一个元素是索引…”-1。为什么这么匆忙?一行没有上下文或讨论的代码几乎永远都不是一个好答案,而且它甚至不像第一次发布的那样有效。这不是只返回一个索引吗?如果我没记错的话,停下来看第一个发现。我以为OP意味着得到第一个索引?我想他想要所有的:
>res115:List[Int]=List(2,3,4)
他说“结果列表的第一个元素是索引…”-1。为什么这么匆忙?没有上下文或讨论的一行代码几乎永远都不是一个好的答案,这甚至不像第一次发布的那样有效。
val ba=List[Byte](33,33,0,33,33)
将使您的测试失败
val ba=List[Byte](33,33,0,33,33)
将使您的测试失败对于一个列表(O(i)复杂度而言,A(i)是昂贵的。您必须首先将其转换为Vector(在这里的文档中检查“性能”)。您完全正确,但我不确定作者是否真的想首先使用列表。这个问题被表述为“检测字符串中的索引”ba属于List类型,在任何情况下:)ba(i)对于List来说是昂贵的(O(i)复杂性)。您必须首先将其转换为Vector(在这里的文档中检查“性能”)。您完全正确,但我不确定作者是否真的想首先使用列表。该问题的措辞为“检测字符串中的索引”ba属于列表类型,在任何情况下:)