我有一个字符串列表,例如"/100" "/100/200"
。
我希望将这些字符串除以/
,然后将得到诸如[[100],[100,200]]
之类的整数列表。
我想遍历该列表的列表,如果该列表足够长,则从每个列表中获取第n个元素,否则移至下一个列表。
众所周知,每个内部列表的最大长度为n
。
示例:
n= 3
slashString -> "/100/200/300","/200/300","/100/200/400"
在上述情况下,我希望将整数列表作为300,400
。
List<Integer> output = slashString.stream()
.map(x->Arrays.stream(x.split("/")).collect(Collectors.toList()))
.filter(x->x.size()==3)
我能够思考到上面。我最终将如何在所有整数列表中收集第三个元素。
答案 0 :(得分:4)
只需将每个List
映射到List
的第三个元素并收集:
List<Integer> list = Stream.of ("100/200/300","200/300","100/200/400")
.map(x->Arrays.stream(x.split("/")).collect(Collectors.toList()))
.filter(x->x.size()==3)
.map(l->Integer.valueOf (l.get(2)))
.collect(Collectors.toList());
请注意,您必须消除输入/
中前导String
。否则,第一List
和第三List
的长度将为4,并且它们将不通过过滤器。或者,您可以要求l.get(2)
的大小为4而不是3(并将l.get(3)
更改为sed 's/\//\\\\057/g;s/&/\\\\046/g'
)。
答案 1 :(得分:4)
使用正则表达式删除除第三项以外的所有词,过滤掉空的内容,瞧!
List<Integer> list = Stream.of("100/200/300", "200/300", "100/200/400")
.map(s -> s.replaceAll("^([^/]/[^/]/)?([^/]+)?(/.*)?", "$2"))
.filter(s -> !s.isEmpty())
.map(Integer::valueOf)
.collect(Collectors.toList());
regex始终匹配整个字符串,并用第三个术语替换它,这被捕获为第2组,但是由于所有内容都是可选的,因此如果没有第三个术语,则第2组(最终结果)为空白。
这种方法只处理字符串,通过避免使用丑陋的数组代码来简化事情。
答案 2 :(得分:3)
你快到了。
过滤大小为3的列表后,获取第三个元素并将其转换为Integer。
此外,请注意,拆分字符串/100/200
将给您一个{<1>}(String[]
),其中空字符串为第一个元素。因此,我使用["", "100", "200"]
skip(1)
答案 3 :(得分:3)
您不需要制作中间列表。而是将每个字符串变成一个空的流或仅包含 <form>
<label for="name" >Name of product</label>
<input type="text" id="name" class="input-product">
<label for="price">Price of product</label>
<input type="text" id="price" class="input-product">
<label for="count">Count of product</label>
<input type="text" id="count" class="input-product">
<button id="add">Add</button>
</form>
的第n个元素,并使用skip(n).limit(1)
将所有小的流合并在一起:
flatMap
答案 4 :(得分:0)
您可以像这样使用skip
和limit
轻松实现它,
final int elementToFetch = 3;
List<Integer> selectedVals = slashString.stream()
.map(s -> Arrays.stream(s.split("/")).skip(elementToFetch).limit(elementToFetch + 1)
.map(Integer::valueOf).collect(Collectors.toList()))
.flatMap(List::stream)
.collect(Collectors.toList());
上述解决方案还将优雅地处理由于split
操作而创建的第一个空元素。