此示例将展示如何使用Java、Java8 和Guava实现基于指定比较器的对象数组排序。
使用 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 中的专用 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);
}
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);
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : http://www.leveluplunch.com/java/examples/sort-array/
内容来源于网络,如有侵权,请联系作者删除!