Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 如何获取文档每个部分的第一段和最后一段?_String_Algorithm_Haskell - Fatal编程技术网

String 如何获取文档每个部分的第一段和最后一段?

String 如何获取文档每个部分的第一段和最后一段?,string,algorithm,haskell,String,Algorithm,Haskell,我在为以下问题构造算法时遇到了困难:给定一本教科书(),查找每个部分的第一段和最后一段 在Haskell中,通过传递换行符参数,使用split、groupify或filter可以轻松获取每个段落,效果很好。然而,其余的对我来说很复杂(我只熟悉OOP)。如果我们将标题作为基本大小写,文本中将有两个标题字符串:一个在索引部分,另一个在文本本身。程序如何区分它们?此外,代码如何知道两段之间是否有两行空行 这是我试图解决的问题 通过将文本拆分为段落的元素,将每个段落放入一个数组中 搜索数组中标题的索引,

我在为以下问题构造算法时遇到了困难:给定一本教科书(),查找每个部分的第一段和最后一段

在Haskell中,通过传递换行符参数,使用
split
groupify
filter
可以轻松获取每个段落,效果很好。然而,其余的对我来说很复杂(我只熟悉OOP)。如果我们将标题作为基本大小写,文本中将有两个标题字符串:一个在索引部分,另一个在文本本身。程序如何区分它们?此外,代码如何知道两段之间是否有两行空行

这是我试图解决的问题

  • 通过将文本拆分为段落的元素,将每个段落放入一个数组中

  • 搜索数组中标题的索引,并查找每个标题的第二次出现以及该索引的名称

  • 获取段落数组[index+1]作为第一个元素

  • 获取段落_数组[index-1]作为上一节的最后一个元素

  • 我很困惑。任何帮助都将不胜感激

    更新:一个部分就像是每个标题的一部分。例如,一本微积分书可能包含12章,每章可能有8节。我们需要思考的是,这本书只有一章,有4-5节。
    标题可以是整数、极限等。

    下面是我如何处理这个问题的示意图

    我假设您有一些函数
    isTitle::String->Bool
    ,可以 确定某个字符串是否为标题,以及您是否有文本 拆分为段落和标题列表(即类型
    [String]

    我从一个数据类型开始,在列表中有两个元素的游标, 这样的数据类型通常称为Zipper

    data TwoZip a =
      TwoZip { front :: [a]
             , first :: a
             , second :: a
             , back :: [a]
             }
      deriving (Eq, Show)
    
    -- make a zipper from a list
    mkZip :: [a] -> Maybe (TwoZip a)
    mkZip (first:second:back) = Just (TwoZip [] first second back)
    mkZip _ = Nothing
    
    -- advance the zipper
    advance :: TwoZip a -> Maybe (TwoZip a)
    advance TwoZip{..}
      | (x:xs) <- back = Just (TwoZip (first:front) second x xs)
    advance _ = Nothing
    
    -- and rewind our zipper (not needed in this case but nice for
    -- completeness sake)
    rewind :: TwoZip a -> Maybe (TwoZip a)
    rewind TwoZip{..}
      | (x:xs) <- front = Just (TwoZip xs x first (second:back))
    rewind _ = Nothing
    
    然后是一些(简化的)测试数据:

    testData = map show [1,2,3,1,3,4,1,4,3]
    isTitle = (== "1")
    
    first_paragraphs = findFirsts isTitle testData
    
    正如我们所希望的:

    λ> first_paragraphs
    ["2","3","4"]
    
    您可能会发现如何将此扩展到查找
    最后一段以及如何在一次迭代中完成它们。

    文本中将有两个标题字符串
    在这个特定文本中,文本本身的标题字符串总是紧跟在换行符之后。在索引中,它们前面有空格。什么是节?看起来是问题的关键部分,可能是第一个要分开的部分,但你几乎没有在问题中提到它。如果你在算法中添加一些小例子,尤其是段落、标题和章节,会更清楚。我为问题添加了更新。谢谢你提醒我,我认为这不是解决我问题的正确方法:/请详细说明原因!首先,我不认为这不能解决标题和段落之间没有空行的问题,你的测试用例是一个整数数组,我无法解决如何使用我的文件进行测试。代码对我来说是如此复杂和先进,我不希望它成为这样,因为我对haskell很陌生,正在寻找一个更基本、更容易理解的解决方案。@user3104760:你能使用上面的任何一个吗?是的,很抱歉我的误解,我只是在学习全新的。谢谢你的帮助:)
    testData = map show [1,2,3,1,3,4,1,4,3]
    isTitle = (== "1")
    
    first_paragraphs = findFirsts isTitle testData
    
    λ> first_paragraphs
    ["2","3","4"]