我所拥有的Java类赋值要求我对多维字符串数组进行排序。它还需要输入是否要按名字或姓氏排序。我不太了解问题的措辞,即主要类型和粗体部分,所以我将在此处发布。
A部分:多维数组
编写一个程序,使用以下标题对二维数组进行排序:
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"} }
您的程序应询问您是否希望数组按名字或最后一个名称排序。
数组中的行将包含名字。 sortArray中的列将包含姓氏。
答案 0 :(得分:1)
根据我对这个问题的理解,问题只是要求你编写一个程序,用一个名字或姓氏对数组进行排序,两个字段都以数组的形式单独提供。
问题的措辞很奇怪。我认为“行和列”实际上意味着“数组的第一和第二个元素”。我找不到更好的解释。
问题没有明确说明是否允许使用方便的库方法,例如'database' => [
'isAutoCast' => true,
'mysql' => [
'development' => [
'adapter' => 'Mysql',
'host' => getenv('DB_HOST') ?: 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'test',
'persistent' => true
],
'production' => [
'adapter' => 'Mysql',
'host' => getenv('DB_HOST'),
'username' => getenv('DB_USER'),
'password' => getenv('DB_PASS'),
'dbname' => getenv('DB_NAME'),
'persistent' => true
]
],
'results' => [
'flatten' => true,
'masterValues' => 'extract', // null | extract
'scope' => 'public', // null | public | protected | private
]
],
。在实践中,由于其方便性,我会使用Arrays.sort()
。如果你需要明确地编写排序代码,请告诉我,我也可以写它。
P.S。在设置比较器时,我使用了lambda语句,这是一个Java 8+特性。如果使用Java 7,请使用匿名类。
代码:
Arrays.sort()
答案 1 :(得分:0)
通过选择排序对名称进行排序,使用该标志确定是否应按名字或姓氏排序。
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
答案 2 :(得分:0)
以下是使用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数组转换为字符串列表。
答案 3 :(得分:0)
首先,让我们定义一个我们想要管理的订单的枚举。这将保存我们想要用于排序的索引。
private enum SortType {
FIRSTNAME(1, 0),
LASTNAME(0, 1);
int sortIndex;
int sortIndex2;
private SortType(int sortIndex, int sortIndex2){
this.sortIndex = sortIndex;
this.sortIndex2 = sortIndex2;
}
}
注意:这可能是一个数组,允许我们定义无限量的“后备”列。
然后,我们需要做的就是创建比较器以根据这两个索引进行排序:
private static void sort(String[][] array, SortType type){
Arrays.sort(array, (a1, a2) -> {
int r = a1[type.sortIndex].compareTo(a2[type.sortIndex]);
return r == 0 ? a1[type.sortIndex2].compareTo(a2[type.sortIndex2]) : r;
});
}
让我们创建方法来获取用户的输入:
private static SortType getType(Scanner sc){
boolean again = false;
String input;
System.out.println("Sort option.\n1 : Firstname\n2: Lastname");
SortType type = null;
//Get a valid input for the type.
do{
input = sc.nextLine().trim();
if(input.equals("1")){
type = SortType.FIRSTNAME;
again = false;
} else if(input.equals("2")){
type = SortType.LASTNAME;
again = false;
} else {
System.out.println("Bad input, try again");
again = true;
}
}while(again);
return type;
}
让我们运行它:
public static void main(String... args) {
String[][] array = { { "Bill", "Jones" }, { "Janet", "Kline" }, { "George", "Bailey" }, { "Ellan", "Sanches" }, { "Tom", "Nguyen" },
{ "William", "Walters" }, { "Author", "James" }, { "Henry", "Daniels" }, { "Mike", "Franklin" }, { "Julie", "Andrews" } };
System.out.println(Arrays.deepToString(array));
Scanner sc = new Scanner(System.in);
SortType type = getType(sc);
sc.close();
//Sort the array
sort(array, type);
//Print the array
System.out.println(Arrays.deepToString(array));
}
<[比尔,琼斯],[珍妮特,克莱恩],[乔治,贝利],[艾伦,桑切斯],[汤姆,阮],[威廉,沃尔特斯],[作者,詹姆斯],[亨利,丹尼尔斯] ],[迈克,富兰克林],[朱莉,安德鲁斯]] 排序选项。
1:名字
2:姓氏
SA
输入不好,再试一次 5
输入不好,再试一次 2
[[作者,詹姆斯],[比尔,琼斯],[艾伦,桑切斯],[乔治,贝利],[亨利,丹尼尔斯],[珍妮特,克莱恩],[朱莉,安德鲁斯],[迈克,富兰克林],[ Tom,Nguyen],[William,Walters]]