合并列表[“ A”,“ XYZ”,“ AXTU”]和[2、4、6]
第一个列表按字长排序。如果第一个列表中的字符串长度与第二个列表中的数字相同,则首先出现的字符串应如下所示:
[“ A”,2,“ XYZ”,“ AXTU”,4、6]。
我这样尝试过:
Stream<String> stream = Stream.concat(list1.stream(), list2.stream().map(val -> Integer.toString(val)));
System.out.println(stream.sorted().collect(Collectors.toList()));
输出是这样的:
[2,4,6,A,AXTU,XYZ]
有解决这个问题的主意吗?提前致谢。:)
由于混合类型,这有点令人费解,但是这是可以完全使用lambda完成的一种方法:
Stream<Object> stream = Stream.concat(list1.stream(), list2.stream());
System.out.println(stream.sorted((Object o1, Object o2) ->
(o1 instanceof String ? 2*((String)o1).length() : 1+2*(Integer)o1)
- (o2 instanceof String ? 2*((String)o2).length() : 1+2*(Integer)o2)
).collect(Collectors.toList()));
基本思想是定义一个lambda,它使用标准compareTo逻辑将长度(如果是字符串)与值(如果是整数)进行比较a - b
。但是,为了处理平局,我将所有值乘以2
,然后1
在Integer
值上添加了额外的值。Integer
如果是平局,这将导致最后排序。
演示:http : //ideone.com/39ppGD
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句