根据字符串长度对字符串数组进行排序

1. 概述

在本教程中,我们将探讨根据元素的长度对字符串数组进行排序的不同方法。

2.比较器

在 Java 中进行排序时,我们经常定义一个Comparator来返回两个参数之间的顺序。排序算法应用Comparator生成的排序顺序并返回排序结果。

定义Comparator时,我们实现以下方法

int compare(T o1, T o2);

根据 Java API,如果o1小于o2 ,则此方法必须返回负值;如果两者相等,则返回零;如果o1大于o2 ,则返回正值。

在后面部分的示例中,我们将使用这个未排序的字符串数组来进行说明:

String[] inputArray = new String[] {"am", "today", "too", "I", "busy"};

当inputArray按字符串长度排序时,我们期望得到以下数组:

String[] SORTED = new String[] {"I", "am", "too", "busy", "today"};

3. 通过自定义比较器进行比较

最简单的方法是定义一个自定义字符串比较器,根据字符串长度进行数字比较:

public class StringLengthComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
}

我们将调用Array.sort()对数组进行排序。在我们的例子中,我们必须提供第二个参数,即我们的自定义比较器。否则,排序将基于自然顺序:

@Test
void whenSortByCustomComparator_thenArraySorted() {
    StringLengthComparator comparator = new StringLengthComparator();
    Arrays.sort(inputArray, comparator);
    assertThat(inputArray).isEqualTo(SORTED);
}

根据我们的需要,如果Comparator是一次性使用的,我们可以定义一个匿名类,而不是单独的类:

@Test
void whenSortByInnerClassComparator_thenArraySorted() {
    Arrays.sort(inputArray, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return Integer.compare(s1.length(), s2.length());
        }
    });
    assertThat(inputArray).isEqualTo(SORTED);
}

4. Lambda 表达式比较

由于 Java 8 引入了lambda 表达式,我们可以通过提供 lambda 表达式而不是使用匿名类来简化以前的方法。lambda是一个可以作为对象传递的匿名函数。

使用 lambda 表达式,我们可以将比较函数作为第二个参数传递给Array.sort(),而无需显式定义任何类。这大大提高了代码的可读性:

@Test
void whenSortedByLambda_thenArraySorted() {
    Arrays.sort(inputArray, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
    assertThat(inputArray).isEqualTo(SORTED);
}

这个例子和上一节做的一样。只是当我们用 lambda 表达式来定义它时会更简洁。

5. 通过比较函数进行比较

Java 8 还在Comparator类中引入了方便的比较静态函数。

Comparator.comparingInt()是我们可以在这里采用的。此静态函数接受返回整数的方法引用。对于以下示例,我们将应用String::length作为获取字符串长度的方法引用:

@Test
void whenSortedByComparingInt_thenArraySorted() {
    Arrays.sort(inputArray, Comparator.comparingInt(String::length));
    assertThat(inputArray).isEqualTo(SORTED);
}

再次,这与前一个功能相同,但语法更加简化。

六,结论

在本文中,我们探讨了不同的排序方法。它基于为Array.sort()提供一个专用的比较器,该比较器根据字符串数组的长度对其进行排序。

可以从自定义Comparator类、lambda 表达式或比较函数创建Comparator 。

本文翻译自:https://www.baeldung.com/java-sort-string-array-length-comparator

 

请登录后发表评论

    没有回复内容