我的一个Java类分配要求我对多维字符串数组进行排序。它还需要输入您是想按名字排序还是按姓氏排序。我不太理解这个问题的措辞,也就是主要的排序和粗体部分,所以我会把它贴在这里。
编写一个程序,使用以下标题对二维数组进行排序:
Public static void sort string ( nameSort [][] )
该方法应先对行执行主排序,然后对列执行主排序。
使用以下数据测试您的程序:
{
{“Bill”,”Jones”},
{“Janet”,”Kline”},
{“George”,”Bailey”},
{“Ellan”,”Sanches”},
{“Tom”,”Nguyen”},
{“William”,”Walters},
{“Author”,”James”},
{“Henry”,”Daniels”},
{“Mike”,”Franklin”},
{“Julie”,”Andrews"}
}
您的程序应该询问您是希望数组按名字排序还是按最后一个sName排序。
数组中的行将包含名字。sortArray中的列将包含姓氏。
以下是使用Java 8的最低限度代码:
public static void sort2DArray(boolean sortByFirstName) {
System.out.println("***** Sorting 2D Array *****");
String[][] arr = {{"Bill","Jones"},
{"Janet","Kline"},
{"George","Bailey"},
{"Ellan","Sanches"},
{"Tom","Nguyen"}};
List<String> l = convertToList(arr);
System.out.println("List = "+l.toString());
if(sortByFirstName)
Collections.sort(l, (s1, s2) -> s1.split(" ")[0].compareTo(s2.split(" ")[0]));
else
Collections.sort(l, (s1, s2) -> s1.split(" ")[1].compareTo(s2.split(" ")[1]));
System.out.println("Sorted List = "+l.toString());
}
public static List<String> convertToList(String[][] arr){
List<String> l8 = Arrays.asList(arr).stream().map(a -> a[0] + " "+ a[1]).collect(Collectors.toList());
return l8;
}
说明:1。首先将2D数组转换为字符串列表。
通过选择排序对名称进行排序,使用标志确定是否应按名字或姓氏排序。
public static void main(String[] args) {
String[][] names =
{{"Bill","Jones"},
{"Janet","Kline"},
{"George","Bailey"},
{"Ellan","Sanches"},
{"Tom","Nguyen"},
{"William","Walters"},
{"Author","James"},
{"Henry","Daniels"},
{"Mike","Franklin"},
{"Julie","Andrews"}};
print(names);
sortNames(names, true);
System.out.println("-----");
print(names);
}
public static void print(String[][] name) {
int n = name.length;
for (int i = 0; i < n; i++) {
System.out.println(name[i][0] + " " + name[i][1]);
}
}
private static void swap(String[][] name, int i, int j) {
String firstName = name[i][0];
String lastName = name[i][1];
name[i][0] = name[j][0];
name[j][0] = firstName;
name[i][1] = name[j][1];
name[j][1] = lastName;
}
public static void sortNames(String[][] name, boolean orderByFirst) {
int n = name.length;
for (int i = 0; i < n - 1; i++) {
int f = i;
for (int j = i; j < n; j++) {
// Sort on first name
if (orderByFirst) {
int compFirstName = name[f][0].compareTo(name[j][0]);
if (compFirstName > 0) {
f = j;
}
// Same fist name, sort on last name
else if (compFirstName == 0 && name[f][1].compareTo(name[j][1]) > 0) {
f = j;
}
} else {
// sort by last name instead
int comptLastName = name[f][1].compareTo(name[j][1]);
if (comptLastName > 0) {
f = j;
}
// Same last name, sort on first name
else if (comptLastName == 0 && name[f][0].compareTo(name[j][0]) > 0) {
f = j;
}
}
}
swap(name, i, f);
}
}
输出(按名字排序):
Author James
Bill Jones
Ellan Sanches
George Bailey
Henry Daniels
Janet Kline
Julie Andrews
Mike Franklin
Tom Nguyen
William Walters
输出(按姓氏排序):
Julie Andrews
George Bailey
Henry Daniels
Mike Franklin
Author James
Bill Jones
Janet Kline
Tom Nguyen
Ellan Sanches
William Walters
根据我对这个问题的理解,这个问题只是要求您编写一个程序,根据名字或姓氏对数组进行排序,以数组的形式分别提供这两个字段。
不过,这个问题的措辞很奇怪。我认为“行和列”实际上是指“数组的第一个和第二个元素”。我找不到更好的解释。
问题没有明确说明是否使用方便的库方法,如数组。允许排序()
。实际上,数组。sort()
由于其方便性,我将使用它。如果需要显式编写排序代码,请告诉我,我也可以编写。
另外,在设置比较器时,我使用了lambda语句,这是Java8的一个特性。如果使用Java 7,则使用匿名类。
代码:
// Test array.
String[][] test = { { "Bill", "Jones" }, { "Janet", "Kline" }, { "George", "Bailey" },
{ "Ellan", "Sanches" }, { "Tom", "Nguyen" }, { "William", "Walters" }, { "Author", "James" },
{ "Henry", "Daniels" }, { "Mike", "Franklin" }, { "Julie", "Andrews" } };
// Print unsorted array.
System.out.println("Unsorted array:");
for (String[] strArr : test)
{
System.out.println(strArr[0] + " " + strArr[1]);
}
Scanner input = new Scanner(System.in);
Comparator<String[]> c;
// Loop until correct input.
while (true)
{
System.out.println("Sort by first name or last name?");
System.out.println("Type f for first name, or l for last name.");
String in = input.nextLine();
if (in.equals("f"))
{
// Set comparator to compare by first name then last name.
c = (a1, a2) ->
{
int result = a1[0].compareTo(a2[0]);
if (result == 0)
{
result = a1[1].compareTo(a2[1]);
}
return result;
};
break;
}
if (in.equals("l"))
{
// Set comparator to compare by last name then first name.
c = (a1, a2) ->
{
int result = a1[1].compareTo(a2[1]);
if (result == 0)
{
result = a1[0].compareTo(a2[0]);
}
return result;
};
break;
}
System.out.println("Illegal input. Please try again.");
}
// Sort.
Arrays.sort(test, c);
// Print sorted array.
System.out.println("Sort complete. Sorted array:");
for (String[] strArr : test)
{
System.out.println(strArr[0] + " " + strArr[1]);
}
我需要帮助来分别获得名字和姓氏。 字段为[全名]:Halsey S Dunn 我可以单独获得名字,但无法单独获得姓氏: 这是我的名字和姓氏代码: 我的结果需要是:
问题内容: 我有一个基于运动的不同类型球员的arrayList。我需要按姓氏对arrayList中的播放器列表进行排序以开始。如果2个玩家的姓氏相同,则需要按名字对这2个玩家进行排序。示例:格式姓氏姓氏Williams Robert Phillips Warren Doe John Phillips Mark 输出应为Doe John Phillips Mark Phillips Warren W
我有一张名为“有益”的表。关于它的一些事实: 受益人属于一个组织 一个组织有许多有益的 受益人有名字和姓氏,没有其他身份证明形式 表中的一些示例数据 我想通过名字和姓氏查找来自某个组织的有益信息是否也存在于其他组织中,如果是,我想获取组织ID。 在上面的示例数据中,我想要的是给定组织id,查询应该返回,因为对组织也有好处但不是因为即使它们匹配名字,它们也不匹配姓氏 我提出了以下问题: 它有点工作,
问题内容: 我有一个客户列表,其名称为全名。我想创建一个将全名作为参数并分别返回名字和姓氏的函数。如果不可能,我可以有两个单独的函数,一个返回名字,另一个返回姓氏。全名列表包含最多三个单词的名称。我想要的是: 全名由两个词组成时。第一个应该是名称,第二个应该是姓氏。 当一个全名由三个词组成时。第一个单词和中间单词应为名字,第三个单词应为姓氏。 例子:- 结果:- 我搜索并找到了无法按预期运行的解决
我提示用户输入他的名字、姓氏和年龄。 我使用确认对话框询问用户是否想添加另一个人,然后我显示他输入的名字。 我如何按名字、第二个名字等对这些人进行分类?
问题内容: 我有一个带有文件名的字符串列表: 输出: 但是我想要: 有没有简单的方法可以做到这一点? 问题答案: 是: 说明:字符串按词法排序,因此在字符串之前(因为< ,因此忽略第一个字符串之后的内容)。因此,我们使用的参数是一个回调函数,该函数接受一个列表项并返回用于对该项目进行排序的值- 在您的情况下,是从文件名的第一部分构建的整数。这样,列表就可以正确地按数值排序。