我正在寻找一种方法来测试一个给定的字符串是否为整个字符串重复自己.
例子:
[
'0045662100456621004566210045662100456621', # '00456621'
'0072992700729927007299270072992700729927', # '00729927'
'001443001443001443001443001443001443001443', # '001443'
'037037037037037037037037037037037037037037037', # '037'
'047619047619047619047619047619047619047619', # '047619'
'002457002457002457002457002457002457002457', # '002457'
'001221001221001221001221001221001221001221', # '001221'
'001230012300123001230012300123001230012300123', # '00123'
'0013947001394700139470013947001394700139470013947', # '0013947'
'001001001001001001001001001001001001001001001001001', # '001'
'001406469760900140646976090014064697609', # '0014064697609'
]
Run Code Online (Sandbox Code Playgroud)
是重复自己的字符串,和
[
'004608294930875576036866359447',
'00469483568075117370892018779342723',
'004739336492890995260663507109',
'001508295625942684766214177978883861236802413273',
'007518796992481203',
'0071942446043165467625899280575539568345323741',
'0434782608695652173913',
'0344827586206896551724137931',
'002481389578163771712158808933',
'002932551319648093841642228739',
'0035587188612099644128113879',
'003484320557491289198606271777',
'00115074798619102416570771',
]
Run Code Online (Sandbox Code Playgroud)
是那些没有的例子.
我给出的字符串的重复部分可能很长,并且字符串本身可以是500或更多字符,因此循环遍历每个字符尝试构建模式然后检查模式与字符串的其余部分似乎非常慢.乘以可能数百个字符串,我看不到任何直观的解决方案.
我已经看了一下正则表达式,当你知道你在寻找什么,或者至少是你正在寻找的模式的长度时,它们看起来很好.不幸的是,我也不知道.
如何判断一个字符串是否重复,如果是,那么最短的重复子序列是什么?
假设我想复制目录的内容,不包括名称中包含"音乐"一词的文件和文件夹.
cp [exclude-matches] *Music* /target_directory
Run Code Online (Sandbox Code Playgroud)
什么应该代替[exclude-matches]来实现这个目标?
在C#7中我们可以使用
if (x is null) return;
Run Code Online (Sandbox Code Playgroud)
代替
if (x == null) return;
Run Code Online (Sandbox Code Playgroud)
使用新方法(前一个例子)比旧语法有什么好处吗?
语义学有什么不同?
只是品味问题?如果没有,何时使用一个或另一个.
参考.
我从这个问题得到以下代码:
def addChild(n: Node, newChild: Node) = n match {
case Elem(prefix, label, attribs, scope, child @ _*) => Elem(prefix, label, attribs, scope, child ++ newChild : _*)
case _ => error("Can only add children to elements!")
}
Run Code Online (Sandbox Code Playgroud)
除此之外,其中的所有内容都非常清晰: child ++ newChild : _*
它有什么作用?
我明白有Seq[Node]
与另一个连接Node
,然后呢?怎么: _*
办?
是否可以使用Scala中的模式匹配系统进行比较?例如:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
Run Code Online (Sandbox Code Playgroud)
第二个案例陈述是非法的,但我希望能够指定"当a大于"时.
我正在阅读函数式编程,我注意到许多文章都提到模式匹配是函数式语言的核心特性之一.
有人能为Java/C++/JavaScript开发人员解释这是什么意思吗?
如何在字节码级别实现Scala中的模式匹配?
它是否像一系列if (x instanceof Foo)
结构或其他东西?它的性能影响是什么?
例如,给定以下代码(来自Scala By Example第46-48页),该方法的等效Java代码如何eval
?
abstract class Expr
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr
def eval(e: Expr): Int = e match {
case Number(x) => x
case Sum(l, r) => eval(l) + eval(r)
}
Run Code Online (Sandbox Code Playgroud)
PS我可以读取Java字节码,因此字节码表示对我来说已经足够了,但是对于其他读者来说,知道它看起来像Java代码会更好.
PPS Scala编程是否能够解答这一问题以及有关Scala如何实现的类似问题?我订购了这本书,但尚未到货.
我希望能够找到一个单词的第一个字母和一个组中的一个字母(如"ABC")之间的匹配.在伪代码中,这可能看起来像:
case Process(word) =>
word.firstLetter match {
case([a-c][A-C]) =>
case _ =>
}
}
Run Code Online (Sandbox Code Playgroud)
但是我如何抓住Scala中的第一个字母而不是Java呢?如何正确表达正则表达式?是否可以在案例类中执行此操作?
我目前正在尝试将字符串重新转换为多个变量.示例字符串:
ryan_string = "RyanOnRails: This is a test"
Run Code Online (Sandbox Code Playgroud)
我将它与这个正则表达式匹配,有3组:
ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)
Run Code Online (Sandbox Code Playgroud)
现在要访问每个组,我必须做这样的事情:
ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test
Run Code Online (Sandbox Code Playgroud)
这看起来很荒谬,感觉我做错了.我希望能够做到这样的事情:
g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)
Run Code Online (Sandbox Code Playgroud)
这可能吗?还是有比我做得更好的方式?