Scala:将包含长描述的字符串列表转换为仅包含最后句子的字符串列表

时间:2018-04-18 09:52:01

标签: scala

我有一个List [String],例如:

val test=List("this is, an extremely long sentence. Check; But. I want this sentence.",
  "Another. extremely. long. (for eg. description). But I want this sentence.",
    ..)

我希望结果如下:

List("I want this sentence", "But I want this sentence"..)

我尝试了一些方法但没有工作

  

test.map(X => “中。” x.split()reverse.head)
  test.map(X => x.split()最后的 “”)

4 个答案:

答案 0 :(得分:3)

尝试使用此

test.reverse.head.split("\\.").last

处理任何Exception

Try(List[String]().reverse.head.split("\\.").last).getOrElse("YOUR_DEFAULT_STRING")

答案 1 :(得分:2)

您可以map List split String val list = List("this is, an extremely long sentence. Check; But. I want this sentence.", "Another. extremely. long. (for eg. description). But I want this sentence.") list.map(_.split("\\.").last.trim) ,然后选择最后一个元素。请尝试以下代码。

List(I want this sentence, But I want this sentence)

它会给你

boolean isFirstElement = true;
for (int i = 0; i < pList.size() - 1; i++) {
    Point pointOne = pList.get(i);
    for (int j = i + 1; j < pList.size(); j++) {
        Point pointTwo = pList.get(j);
        if (j + 1 == pList.size() && isFirstElement) {
            continue;
        } else {
            // your comparison logic goes here...
        }
    }
    isFirstElement = false;
}

答案 2 :(得分:1)

您可以通过多种方式执行此操作:

对于原始列表中的每个字符串:按.拆分,反转列表,取第一个值

test.map(_.split('.').reverse.headOption)
// List(Some( I want this sentence), Some( But I want this sentence))

.headOption会产生Some("string")None,您可以在其上执行类似.getOrElse("no valid string found")的操作。如果需要,可以修剪不需要的空格。

正则表达匹配

test.map { sentence =>
  val regex = ".*\\.\\s*([^.]*)\\.$".r
  val regex(value) = sentence
  value
}

这将获取一个较长字符串末尾的任何字符串,该字符串前面有句号和空格,后跟一个句号。您可以修改正则表达式以更改正则表达式的确切规则,如果您希望学习更多正则表达式,我建议您使用regex101.com。它非常好。

此解决方案更适合更复杂的示例和要求,但值得记住。如果你担心正则表达式可能不匹配,你可以做一些事情,比如在解压缩之前检查正则表达式是否匹配:

test.map { sentence =>
  val regexString = ".*\\.\\s*([^.]*)\\.$"
  val regex = regexString.r
  if(sentence.matches(regexString)) {
    val regex(value) = sentence
    value
  } else ""
}

在按.

分割字符串后取最后一个
test.map(_.split('.').map(_.trim).lastOption)

答案 3 :(得分:0)

test.map (_.split("\\.").last)

Split采用正则表达式,因此,点代表每个字符,所以你必须掩盖它。

也许你想要包含问号和刘海:

test.map (_.split("[!?.]").last)

修剪周围的空白:

test.map (_.split("[!?.]").last.trim).

reverse.head如果没有last,那么scala> test.map (_.split("[!?.]").reverse.head.trim) res138: List[String] = List(I want this sentence, But I want this sentence) 就是个好主意:

Playlist: [{
  Format: 'HLSv3',
  Name: newKey + '.m3u8',
  OutputKeys: [
     newKey + '.ts'
    ]              
}]