gpt4 book ai didi

java - 递归地将字符串拆分为固定数量的单词 [Java]

转载 作者:行者123 更新时间:2023-12-02 09:03:00 24 4
gpt4 key购买 nike

我正在尝试拆分 String (存储在 ArrayList 中)递归地转换为固定数量的单词(不是字符)。

例如,假设我有一个 ArrayList其中包含以下两个 String短语:

ArrayList<String> words = new ArrayList<String>();
words.add("key1 key2 key3 key4 key5 key6 key7");
words.add("key11 key12 key13 key14 key15 key16 key17");

我想分成 5 个单词的 block ( int desiredListSize = 5; ) - 这将产生以下两个列表:

列表 1:

word1 word2 word3 word4 word5
word2 word3 word4 word5 word6
word3 word4 word5 word6 word7

列表 2:

word11 word12 word13 word14 word15
word12 word13 word14 word15 word16
word13 word14 word15 word16 word17

上面的每个列表将被添加到列表列表数组中,因此输出的格式为:ArrayList<ArrayList<String>()

到目前为止,以下代码片段解决了大部分问题:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public static void splitListIntoWords()
{

int desiredListSize = 5;
final ArrayList<String> textWords = new ArrayList<String>();
textWords.add("key1 key2 key3 key4 key5 key6 key7");
textWords.add("key11 key12 key13 key14 key15 key16 key17");


final List<List<String>> listOfLists = textWords.stream().flatMap(w -> {

final String[] wordList = StringX.splitStrIntoWordsRtrnArr(w); // w.split(" ");

int calculatedListSize = (wordList.length < desiredListSize) ? wordList.length : desiredListSize;

return IntStream.range(0, Math.min(wordList.length - (calculatedListSize - 1), wordList.length)).mapToObj(i -> i ).flatMap(i -> Stream.of(
IntStream.range(i, Math.min(i+desiredListSize, wordList.length)).mapToObj(j -> wordList[j])
.collect(Collectors.toList())));
}) .collect(Collectors.toList());


for (int counter = 0; counter < listOfLists.size(); counter++) {

System.out.println("LIST: " + counter);


System.out.println(listOfLists.get(counter).toString());
}

}

产生以下输出:

LIST: 0
[key1, key2, key3, key4, key5]
LIST: 1
[key2, key3, key4, key5, key6]
LIST: 2
[key3, key4, key5, key6, key7]
LIST: 3
[key11, key12, key13, key14, key15]
LIST: 4
[key12, key13, key14, key15, key16]
LIST: 5
[key13, key14, key15, key16, key17]

但是理想的输出是:

LIST 0:
key1 key2 key3 key4 key5
key2 key3 key4 key5 key6
key3 key4 key5 key6 key7

LIST 1:
key11 key12 key13 key14 key15
key12 key13 key14 key15 key16
key13 key14 key15 key16 key17

上面的两个列表都应添加到 listOfLists .

请注意所需输出中每个列表如何存储字符串操作的结果:key1 key2 key3 key4 key5作为一个单一的String (每个单词之间有一个空格)不是列表

换句话说,当有人调用listOfLists.get(0);时我们应该获得一个列表,其中包含 words.add("key1 key2 key3 key4 key5 key6 key7"); 上的操作结果。当有人调用listOfLists.get(1);时应获得 words.add("key11 key12 key13 key14 key15 key16 key17"); 上的操作结果当然,如果原textWords中有两个以上条目的话然后列出listOfLists将包含相应数量的列表。

谢谢!

最佳答案

操作系统我现在没有时间完善我的帖子,但这是(我认为)原始帖子中更好的。我可能明天某个时候回来,但我还有一份工作需要做:-)

无论如何,这就是:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StackOverflow {

public static void main(final String[] args) {

final List<String> words = new ArrayList<>();
words.add("key1 key2 key3 key4 key5 key6 key7");
words.add("key11 key12 key13 key14 key15 key16 key17");

final List<List<String>> listOfLists = words.stream().flatMap(w -> {

final String[] wordList = w.split(" ");

return IntStream.range(0, Math.min( 3, wordList.length)).mapToObj(i -> i ).flatMap(i -> Stream.of(
IntStream.range(i, Math.min(i+5, wordList.length)).mapToObj(j -> wordList[j])
.collect(Collectors.toList())));
}) .collect(Collectors.toList());

listOfLists.forEach(System.out::println);
}
}

关于java - 递归地将字符串拆分为固定数量的单词 [Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60032231/

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