使用Java、Java8 和Guava实现基于指定比较器的对象数组排序

x33g5p2x  于2022-09-15 转载在 Java  
字(5.2k)|赞(0)|评价(0)|浏览(358)

此示例将展示如何使用Java、Java8 和Guava实现基于指定比较器的对象数组排序。

原生Java

对数值数组进行排序

使用 java,此代码段将使用 Arrays.sort 按数字升序对数组进行排序。

@Test
public void sort_numeric_array_in_java () {

    int[] uwConferenceTitles = {
            1896, 2011, 1901, 1912, 1952,
            1959, 1962, 1999, 1897, 1906,
            1993, 1998,  2010,  2012};

    Arrays.sort(uwConferenceTitles);

    logger.info(Arrays.toString(uwConferenceTitles));

    assertArrayEquals(new int[] {
            1896, 1897, 1901, 1906, 1912,
            1952, 1959, 1962, 1993, 1998,
            1999, 2010, 2011, 2012},
            uwConferenceTitles);
}

对数值数组进行降序排序

使用 java,此代码段将使用重载的 Arrays.sort 按降序对数值数组进行排序。第一个参数是数组,第二个是比较器。我们将使用 Collections.reverseOrder 比较器,它将实现反向自然顺序。

@Test
public void sort_numeric_array_decending_in_java () {

    Integer[] uwConferenceTitles = {
            1896, 2011, 1901, 1912, 1952,
            1959, 1962, 1999, 1897, 1906,
            1993, 1998,  2010,  2012};

    Arrays.sort(uwConferenceTitles, Collections.reverseOrder());

    logger.info(Arrays.toString(uwConferenceTitles));

    assertArrayEquals(new Integer[] {
            2012, 2011, 2010, 1999, 1998,
            1993, 1962, 1959, 1952, 1912,
            1906, 1901, 1897, 1896},
            uwConferenceTitles);

}

排序字符串数组

与上面的排序数值数组类似,此代码段将使用 Arrays.sort 对字符串数组进行排序。

@Test
public void sort_string_array_in_java () {

    String[] wiStateParks = {
            "Mill Bluff State Park",
            "Amnicon Falls State Park",
            "Wyalusing State Park",
            "Big Foot Beach State Park",
            "Willow River State Park",
            "Roche-A-Cri State Park"
        };

    Arrays.sort(wiStateParks);

    logger.info(Arrays.toString(wiStateParks));

    assertArrayEquals(new String[] {
            "Amnicon Falls State Park",
            "Big Foot Beach State Park",
            "Mill Bluff State Park",
            "Roche-A-Cri State Park",
            "Willow River State Park",
            "Wyalusing State Park"},
            wiStateParks);

}

Java 8

对数值数组进行排序

通过使用 java 8 中的专用 IntStream,我们将首先通过调用 IntStream.of 创建一个流。接下来通过调用 sort 方法,我们将按排序顺序返回一个流,然后通过调用 toArray 将其转换为数组。

@Test
public void sort_numeric_array_in_java8() {

    int[] uwConferenceTitles = { 1896, 2011, 1901, 1912, 1952, 1959, 1962,
            1999, 1897, 1906, 1993, 1998, 2010, 2012 };

    int[] sortedTitles = IntStream.of(uwConferenceTitles).sorted()
            .toArray();

    logger.info(Arrays.toString(uwConferenceTitles));

    assertArrayEquals(new int[] { 1896, 1897, 1901, 1906, 1912, 1952, 1959,
            1962, 1993, 1998, 1999, 2010, 2011, 2012 }, sortedTitles);
}

对数值数组进行降序排序

与上面的排序数字数组降序示例一样,我们将创建一个带有 lambda 表达式的比较器,然后是一个反向比较器,并调用 Arrays.sort 传入数组和反向比较器。

@Test
public void sort_numeric_array_decending_in_java8 () {

    Integer[] uwConferenceTitles = {
            1896, 2011, 1901, 1912, 1952,
            1959, 1962, 1999, 1897, 1906,
            1993, 1998,  2010,  2012};

    Comparator<Integer> normal = Integer::compare;
    Comparator<Integer> reversed = normal.reversed();

    Arrays.sort(uwConferenceTitles, reversed);

    assertArrayEquals(new Integer[] {
            2012, 2011, 2010, 1999, 1998,
            1993, 1962, 1959, 1952, 1912,
            1906, 1901, 1897, 1896},
            uwConferenceTitles);
}

排序字符串数组

使用 Arrays.stream().sorted() 我们将根据元素的自然顺序对数组进行排序。

@Test
public void sort_string_array_in_java8 () {

    String[] wiStateParks = {
            "Mill Bluff State Park",
            "Amnicon Falls State Park",
            "Wyalusing State Park",
            "Big Foot Beach State Park",
            "Willow River State Park",
            "Roche-A-Cri State Park"
        };

    Object[] sorted = Arrays.stream(wiStateParks).sorted().toArray();

    logger.info(Arrays.toString(sorted));

    assertArrayEquals(new String[] {
            "Amnicon Falls State Park",
            "Big Foot Beach State Park",
            "Mill Bluff State Park",
            "Roche-A-Cri State Park",
            "Willow River State Park",
            "Wyalusing State Park"},
            sorted);

}

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

通过使用 lambda 表达式,我们将抽象出如何排序的具体细节,并专注于创建一个比较字符串长度的简单比较器。

@Test
public void sort_string_array_in_java8_by_length () {

    String[] wiStateParks = {
            "Mill Bluff State Park",
            "Amnicon Falls State Park",
            "Wyalusing State Park",
            "Big Foot Beach State Park",
            "Willow River State Park",
            "Roche-A-Cri State Park"
        };

    Arrays.sort(wiStateParks, (s1, s2) -> s1.length() - s2.length());

    logger.info(Arrays.toString(wiStateParks));

    //or Arrays.sort(wiStateParks, (String s1, String s2) -> s1.length() - s2.length());

    assertArrayEquals(new String[] { "Wyalusing State Park",
            "Mill Bluff State Park", "Roche-A-Cri State Park",
            "Willow River State Park", "Amnicon Falls State Park",
            "Big Foot Beach State Park" }, wiStateParks);
}

Google Guava实现

Ordering is a guava "enriched" comparator class 在排序数组时提供了创建、链接和应用的灵活性。

对数值数组进行降序排序

@Test
public void sort_numeric_array_decending_in_java_with_guava () {

    Integer[] uwConferenceTitles = {
            1896, 2011, 1901, 1912, 1952,
            1959, 1962, 1999, 1897, 1906,
            1993, 1998,  2010,  2012};

    Arrays.sort(uwConferenceTitles, Ordering.natural().reverse());

    logger.info(Arrays.toString(uwConferenceTitles));

    assertArrayEquals(new Integer[] {
            2012, 2011, 2010, 1999, 1998,
            1993, 1962, 1959, 1952, 1912,
            1906, 1901, 1897, 1896},
            uwConferenceTitles);

}

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

@Test
public void sort_string_array_in_java_with_guava_by_length () {


    Ordering<String> byLengthOrdering = new Ordering<String>() {
        public int compare(String left, String right) {
            return Ints.compare(left.length(), right.length());
        }
    };

    String[] wiStateParks = { "Mill Bluff State Park",
            "Amnicon Falls State Park", "Wyalusing State Park",
            "Big Foot Beach State Park", "Willow River State Park",
            "Roche-A-Cri State Park" };

    Arrays.sort(wiStateParks, byLengthOrdering);

    logger.info(Arrays.toString(wiStateParks));

    assertArrayEquals(new String[] { "Wyalusing State Park",
            "Mill Bluff State Park", "Roche-A-Cri State Park",
            "Willow River State Park", "Amnicon Falls State Park",
            "Big Foot Beach State Park" }, wiStateParks);

}

相关文章