gpt4 book ai didi

java - 在 Java 中使用扫描仪分隔符,如何保留用作分隔符的字符串?

转载 作者:太空宇宙 更新时间:2023-11-04 14:02:33 24 4
gpt4 key购买 nike

我的程序使用标点符号作为分隔符逐句从文件中读取故事。它将句子存储在 ArrayList 中,然后打乱 ArrayList 并打印它,从而在每次运行程序时创建不同的故事。我的问题是使用分隔符消除了新故事中的标点符号,有没有办法我仍然可以使用分隔符但将字符串保留为我正在阅读的内容的一部分?

最佳答案

我遇到了同样的问题并来到这里,但之前的答案不符合我的需求。经过一番尝试和错误后,这就是我想出的方法,所以我回来分享它,以防它对某人有帮助,稍后:

通用解决方案

使用Scanner#findInLine (甚至 Scanner#findWithinHorizon )捕获输入流中的分隔符:

/* This method does not close the given scanner. That must happen, elsewhere (typically in a loop that calls this) */
public String getNextPattern(Scanner s, String pattern) {
s.useDelimiter(pattern);
if(!s.hasNext()) {
return null;
}
s.next();
return s.findInLine(pattern);
}
<小时/>

说明

这里值得注意的是扫描器实际上在输入流上留下了分隔符。所以这个方法所做的就是:

  1. 将分隔符设置为我们想要在流中匹配的内容
  2. 前进到下一个标记(即丢弃与分隔符不匹配的输入)
  3. 从流中删除分隔符。鉴于扫描仪的工作方式,我们知道分隔符将是流中的下一个文本。

此解决方案是从流或文件中提取任何正则表达式模式的出现的一种方法。

<小时/>

您的具体问题的解决方案

就我而言,我丢弃了 token 。就您而言,这些是您想要保留的句子,因此您希望将它们存储在 ArrayList 中。按照这些思路可以解决您的具体问题:

// simplistic approach to handling whitespace
private static final String PUNCTUATION_PATTERN = "[.!?]\\s*";

// for example purposes, read from stdin and write to stdout
public void shuffleStory(InputStream input) {
try(Scanner s = new Scanner(input)) {
s.useDelimiter(PUNCTUATION_PATTERN);
List<String> sentences = new ArrayList<>();
while(s.hasNext()) {
sentences.add(s.next() + s.findInLine(PUNCTUATION_PATTERN).trim());
}
Collections.shuffle(sentences);
System.out.println(String.join(" ", sentences));
}
}

关于java - 在 Java 中使用扫描仪分隔符,如何保留用作分隔符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com