返回

「随手记」Java中使用比较器解决按照指定的字符串顺序排序List

后端

引言
今天工作需求中,有一个小需求,要按照某一个特定的顺序排列一个List。举例:

原始的List中存在3个String元素:

原始List:python,Java,C++

现在需要按照另一个字符串列表中的顺序进行排序,比如给定的字符串顺序列表:

排序顺序:C++,Java,python

那么经过排序后的新List为:

新List:C++,Java,python

Java中使用比较器进行排序

在Java中,可以使用Comparator接口对对象进行排序。Comparator接口提供了一个名为compare()的方法,该方法用于比较两个对象并返回一个int值:

  • 如果第一个对象小于第二个对象,则返回-1。
  • 如果第一个对象等于第二个对象,则返回0。
  • 如果第一个对象大于第二个对象,则返回1。

我们可以实现Comparator接口来定义我们自己的比较规则。在此示例中,我们要按照给定的字符串顺序列表对List进行排序,因此我们需要实现一个比较器,将元素与给定的字符串顺序列表进行比较。

以下是Comparator实现:

import java.util.Comparator;

public class StringComparator implements Comparator<String> {

    private List<String> order;

    public StringComparator(List<String> order) {
        this.order = order;
    }

    @Override
    public int compare(String s1, String s2) {
        int index1 = order.indexOf(s1);
        int index2 = order.indexOf(s2);

        if (index1 == -1) {
            return 1;
        } else if (index2 == -1) {
            return -1;
        } else {
            return index1 - index2;
        }
    }
}

在该比较器中,我们维护了一个给定的字符串顺序列表。在比较两个字符串时,我们查找它们在该列表中的索引。如果一个字符串在列表中找不到,则认为它比另一个字符串大。如果两个字符串都在列表中,则我们根据它们的索引进行比较。

应用比较器对List进行排序

有了比较器之后,我们可以使用Collections.sort()方法对List进行排序,如下所示:

List<String> originalList = Arrays.asList("python", "Java", "C++");
List<String> order = Arrays.asList("C++", "Java", "python");

StringComparator comparator = new StringComparator(order);
Collections.sort(originalList, comparator);

System.out.println("排序后的List:" + originalList);

输出:

排序后的List[C++, Java, python]

结论

通过使用Comparator接口,我们可以灵活地对List进行排序。在本文中,我们展示了如何实现一个比较器,该比较器可以按照给定的字符串顺序列表对List中的字符串进行排序。这种技术可以应用于各种排序场景,为Java程序员提供了强大的工具。