[英]Sort two-dimensional array with strings
我正在尝试按姓氏对这个数组进行排序,如果两个姓氏相同,我想按名字对其进行排序:
String[][] phoneBook = {
/* name, number */
{"Sophia Thorarensen", "06508641036"},
{"Emma Blöndal", "06504228512"},
{"Olivia Thorarensen", "06501126965"},
{"Ava Hansen", "06762858077"}
};
它应该是什么样子:
String[][] sortedPhoneBook = {
/* name, number */
{"Emma Blöndal", "06504228512"},
{"Ava Hansen", "06762858077"},
{"Olivia Thorarensen", "06501126965"},
{"Sophia Thorarensen", "06508641036"}
};
这是一个很好的尝试。
这个想法是您需要使用 sort 方法,然后根据您的需要实现自定义 Comparator。
根据 OH GOD SPIDERS 提供的有用链接,这是我设法做到这一点的一种方法。
我也认为排序发生在适当的位置,所以我没有创建新变量。 我只是在最后打印出旧电话簿的内容,以显示它们符合我们想要的顺序。
import java.util.Arrays;
import java.util.Comparator;
public class SortStrings {
public static void main(String[] args) {
String[][] phoneBook = {
/* name, number */
{ "Sophia Thorarensen", "06508641036" }, { "Emma Blöndal", "06504228512" },
{ "Olivia Thorarensen", "06501126965" }, { "Ava Hansen", "06762858077" } };
Arrays.sort(phoneBook, new Comparator<String[]>() {
public int compare(String[] a, String[] b) {
//get first names and last names of what we want to compare.
String first_name_a = a[0].split(" ")[0];
String first_name_b = b[0].split(" ")[0];
String last_name_a = a[0].split(" ")[1];
String last_name_b = b[0].split(" ")[1];
//if the last names are the same, sort by first name
if (last_name_a.compareTo(last_name_b) == 0) {
return first_name_a.compareTo(first_name_b);
}
return last_name_a.compareTo(last_name_b);
}
});
Arrays.stream(phoneBook)
.forEach(elem -> {
Arrays.stream(elem)
.forEach(System.out::println);
});
}
}
Output:
一般来说,最好构建一个Comparator
实例。 要编写干净的代码,您应该将比较器分成两部分:按名字排序,按姓氏排序。
最终的比较器应该基于使用thenComparing()
的简单比较器构建。
public static void sort(String[][] phoneBook) {
final Comparator<String[]> sortByFirstName = (one, two) -> {
String firstName1 = one[0].substring(0, one[0].indexOf(' ')).trim();
String firstName2 = two[0].substring(0, two[0].indexOf(' ')).trim();
return firstName1.compareTo(firstName2);
};
final Comparator<String[]> sortByLastName = (one, two) -> {
String lastName1 = one[0].substring(one[0].lastIndexOf(' ')).trim();
String lastName2 = two[0].substring(two[0].lastIndexOf(' ')).trim();
return lastName1.compareTo(lastName2);
};
final Comparator<String[]> sortByLastNameAndFirstName =
sortByLastName.thenComparing(sortByFirstName);
Arrays.sort(phoneBook, sortByLastNameAndFirstName);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.