我有这个清单:
List<String> names= Arrays.asList(new String[]{"Tom", "louis", "martha", "Tom", "john", "Carol", "Tom", "Simon"});
我想创建三个不同的列表,将值放在单词之间:
"Tom", "louis", "martha";
"Tom", "john", "Carol";
"Tom", "Simon"
我用传统的方法处理索引
我的方式是公正的;
List<Integer> positionsWithTom = new ArrayList<>();
for(int i=0; i<names.size; i++){
...
positionsWithTom = [0,3,6]
}
然后将值放在不同的列表中
这样做并没有多大的好处,也许是流过滤?
2条答案
按热度按时间2eafrhcq1#
首先我收集了元素的索引(
[0, 3, 6]
)有价值的"Tom"
到tomindex
列表。然后我使用sublist()方法。本部分:
就是不要错过最后一个。的最后一个元素
tomindex
是6
我们需要在索引之间获取值6
以及8
所以我们用names.size()
最后。试试这个:
输出:
3hvapo4f2#
我不相信这很容易使自己流。流方法在表达问题语句时也不会比简单的循环更清楚。
只要您不关心子列表的顺序,使用
List.lastIndexOf
和一个while loop
. 请注意,由于这会破坏原始列表,而且这些子列表不会重叠,因此子列表不可能因对原始列表的更改或相互更改而更改(除非存在对原始列表的引用)。但总有人能通过考试sublist
作为ArrayList
如果这是一个问题。印刷品
请注意,可以通过指定
0
在add
方法。但这对我来说可能很昂贵ArrayLists
因为复制。一LinkedList
会减少一点开销。最后,这里是我的流解决方案。
首先,将名字连续地流式处理
sublists
根据地点Tom
位于。所以第一个列表包含了所有的名字,第二个,除了最后一个"Tom"
分组等等。然后,对于每个子列表,从
Tom
从最后开始。把这些清单收集起来。
印刷品
我仍然喜欢while循环解决方案,因为我认为它更干净、更简洁。更精通流的人可能会做得更好。