我有两个包含名字的列表,第一个列表l1
包含个选定的个名字,第二个列表l2
包含个所有的个名字。
- 示例:*
List<String> l1 = {"en", "cu", "eu"};
List<String> l2 = {"ch", "cu", "en", "eu", "pe"};
l1
中的所有元素总是存在于l2
中。
我想得到一个输出,其中所有的常用名都放在开头,后面跟着其余的名字,我需要它们按升序排序,如下所示:
output -> {cu, en, eu, cu, pe};
我尝试做什么,我已经显示如下,但没有得到的想法,如何把共同的元素在开始的位置(第二个列表已经排序),并把其余的元素后,共同的元素
List<String> common = l2.stream().filter(l2::contains).collect(Collectors.toList());
1条答案
按热度按时间cbeh67ev1#
如果我没理解错的话,您希望将第一个列表
l1
中的值放在开头,对第二个列表l2
中的元素进行排序,并且这两部分都应该按字母顺序排序。你需要定义一个自定义的
Comparator
来达到这个目的。从Java8开始,推荐的创建比较器的方法是使用静态工厂方法,比如Comparator.comparing()
。在实现比较器时,首先我们需要检查第一个列表中是否存在特定值,并根据检查结果对元素进行排序(提醒:并且由于列表上的
contains()
是有代价的(它在幕后对列表进行迭代,因此以**O(n)**运行),所以将来自第一列表的数据转储到HashSet
中并且针对该集合执行检查将是性能明智的。为了按字母顺序对列表的两个部分进行排序,我们需要通过应用
Comparator.thenComparing()
并提供Comparator.naturalOrder()
作为参数来链接第二个比较器。以下是它的实现方式: