簡體   English   中英

用字符串對二維數組進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM