在Scala中找到"整洁的数字"

Fre*_*red 2 ruby integer scala

整数是一个数字,其数字是非递减顺序,例如1234.这是一种查找用Ruby编写的整齐数字的方法:

def tidy_number(n)
  n.to_s.chars.sort.join.to_i == n
end

p tidy_number(12345678)     # true
p tidy_number(12345878)     # false
Run Code Online (Sandbox Code Playgroud)

我试着在Scala中编写相同的东西并得出以下内容:

object MyClass {
def tidy_number(n:Int) = n.toString.toList.sorted.mkString.toInt == n;

    def main(args: Array[String]) {
      println(tidy_number(12345678))        // true
      println(tidy_number(12345878))        // false
    }
}
Run Code Online (Sandbox Code Playgroud)

我能在Scala中完成它的唯一方法是将一个整数转换为一个字符串到一个列表,然后对列表进行排序并再次返回.我的问题:还有更好的方法吗?从某种意义上说,"更好"的转化次数更少.我主要是在寻找Scala的简洁部分,但如果有人在Ruby中指出更简洁的方式,我将不胜感激.

Joe*_*ley 5

你可以sorted在Scala中使用字符串,所以

def tidy_number(n: Int) = {
  val s = n.toString
  s == s.sorted
}
Run Code Online (Sandbox Code Playgroud)

分为两部分也可以避免额外的toInt转换.

我从未使用过红宝石,但这篇文章暗示你是最好的方式


Tim*_*Tim 5

您可以检查每个相邻的数字对,以确保第一个值<=第二个:

  def tidy_number(n:Int) =
    n.toString.sliding(2,1).forall(p => p(0) <= p(1))
Run Code Online (Sandbox Code Playgroud)

更新以下有用的评论

如评论中所述,这对于一位数字而言是失败的.把这个和另一个评论放在一起给出了:

  def tidy_number(n:Int) =
    (" "+n).sliding(2,1).forall(p => p(0) <= p(1))
Run Code Online (Sandbox Code Playgroud)

更加迂腐,最好Int在比较之前转换回来,这样你就不依赖于表示数字的字符的排序顺序与数字本身的排序顺序相同.

  def tidy_number(n:Int) =
    (" "+n).sliding(2,1).forall(p => p(0).toInt <= p(1).toInt)
Run Code Online (Sandbox Code Playgroud)

  • (""+ n)...绕过单个数字问题并保存输入toString (2认同)