按名字和姓氏对多维字符串数组进行排序

时间:2018-06-19 02:28:29

标签: java arrays sorting

我所拥有的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中的列将包含姓氏。

4 个答案:

答案 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数组转换为字符串列表。

  1. 然后根据比较器对列表进行排序。

答案 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]]