按 J 中的长度对字符串中的单词进行排序

Posted

技术标签:

【中文标题】按 J 中的长度对字符串中的单词进行排序【英文标题】:Sorting words in a string by their length in J 【发布时间】:2021-04-05 08:56:50 【问题描述】:

我有以下字符串: s=:'我们什么时候可以跳舞' 我可以用这个找到每个单词的长度: # each ;:s 我可以按升序/降序对长度进行排序:(/:~) # each ;:s 这给了我盒装输出。 但是如何打印这些文字呢?

【问题讨论】:

预期输出:(对于升序):我们可以跳舞时 【参考方案1】:

您已经在使用/:~,它是二元Sort Up 的Reflex; /:~ y 等价于 y /: y。这是一个方便的快捷方式,但在这种情况下,您要跳过的是您正在寻找的解决方案。 /:(没有 Reflex)根据将导致排序的 y 的排列排列其 x。 “将导致排序的y 的排列”顺便说一句是单子/: (Grade Up) 是为了。

   ]w=:;:'when can we dance'
+----+---+--+-----+
|when|can|we|dance|
+----+---+--+-----+
   /: w
1 3 2 0
   (/: w)  w
+---+-----+--+----+
|can|dance|we|when|
+---+-----+--+----+
   w /: w
+---+-----+--+----+
|can|dance|we|when|
+---+-----+--+----+

所以要按其他东西对w 进行排序,比如项目的长度,只需提供其他东西作为Sort Up 的y

   w /: # each w
+--+---+----+-----+
|we|can|when|dance|
+--+---+----+-----+
   (/: # each) w     NB. a hook
+--+---+----+-----+
|we|can|when|dance|
+--+---+----+-----+

;: 为您提供字符串中的 J 个单词,这可能不是您想要的:

   ;: 'when can''t we dance'
|open quote
|       ;:'when can''t we dance'

;.Cut 家族或stdlib's splitstring 或regexes 之一可能会有所帮助。

   13 : ';: ''when can we dance'''  NB. 13 : can be a mnemonic
(<;._1 ' when can we dance')"_

   <;._1 ' ','when can''t we dance'
+----+-----+--+-----+
|when|can't|we|dance|
+----+-----+--+-----+
   ' ' splitstring 'when can''t we dance'
+----+-----+--+-----+
|when|can't|we|dance|
+----+-----+--+-----+

   s=:'when can''t   we dance'  NB. excess space
   <;._1 ' ',s  NB. empty boxes in result
+----+-----+++--+-----+
|when|can't|||we|dance|
+----+-----+++--+-----+
   require 'regex'
   '[\w'']+' rxall s
+----+-----+--+-----+
|when|can't|we|dance|
+----+-----+--+-----+

要将这些单词列表重新转换为字符串,

   w
+----+---+--+-----+
|when|can|we|dance|
+----+---+--+-----+
   ;: inv w
when can we dance
   ' ' joinstring w
when can we dance

【讨论】:

感谢 Julian 指出 J 在库支持字符串操作方面提供了什么。【参考方案2】:

朱利安在上面的回答中很好地解释了处理撇号的方法,但如果你忽略它们的存在,我会使用&amp;.(下)和;:(字)根据长度对它们进行排序装箱后再拆箱。

   s=:'when can we dance' 
   (/:  # each)  &. ;: s
we can when dance

(/: # each) 是根据每个长度对它们进行排序的钩子,&amp;.;: 将它们装箱,然后在最后将它们拆箱以提供结果。

【讨论】:

以上是关于按 J 中的长度对字符串中的单词进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按字符串长度对熊猫系列中的列表进行排序

按文本字符长度对目录中的文件进行排序并复制到其他目录[关闭]

按字符串列的长度对数据帧进行排序[重复]

Shell 按照字符串长度进行排序

IOS/Objective-C:按字符串中的单词数对 NSStrings 的 NSArray 进行排序

Groovy:如何按字符串长度顺序对 String:s 的 ArrayList 进行排序?