簡體   English   中英

您如何使用Arrays.sort()按字母順序排列字符串的順序?

[英]How do you alphabetize the order of Strings using Arrays.sort()?

我正在為考試復習問題,其中一個問題是要求我按字母順序排列書名。 如果標題中出現“ The”一詞,我將被忽略。 我的問題是,有沒有辦法在使用Arrays.sort()忽略“ The”的同時對書籍的標題順序進行排序?

最初,我將這些書放在一個稱為的數組列表 ,然后應用:

Arrays.sort(books);

它起作用了,但僅在某種程度上起作用,因為它不會忽略“ The”。 相反,這樣做更好:

public class booktest {

public static void main(String[] args) {
    System.out.println("Enter the title of your book: "); // The Great Gatsby
    String book = IO.readString();
    if(book.substring(0, 3).equalsIgnoreCase("the")){
        book = book.substring(4);
    }
    System.out.println(book); // Output: Great Gatsby

然后比較每本書的首字母以輸出升序?

我想知道是否有更簡單的方法來解決這個問題。 任何線索或建議,將不勝感激。 謝謝。

您必須小心一點。

  1. book.substring(0, 3)對於長度小於3的字符串拋出StringIndexOutOfBoundsException
  2. "the"開頭的標題不一定以單詞“ The”開頭。 例如,它可以以“ There”開頭。

如果您使用的是Java 7或更早的版本,我將采用這樣的單獨方法

private static String noThe(String b) {
    return b.length() >= 4 && b.substring(0, 4).equalsIgnoreCase("the ") ? b.substring(4) : b;
}

那你可以用

Arrays.sort(books, new Comparator<String>() {
    @Override
    public int compare(String b1, String b2) {
        return String.CASE_INSENSITIVE_ORDER.compare(noThe(b1), noThe(b2));
    }
});

在Java 8中,您不需要輔助方法即可

Arrays.sort(books,
            Comparator.comparing(b -> b.length() >= 4 && b.substring(0, 4).equalsIgnoreCase("the ") ? b.substring(4) : b,
                    String.CASE_INSENSITIVE_ORDER));

完整示例(Java 8版本):

String[] books = {
            "The Great Gatsby",
            "The Witches",
            "Persuasion",
            "It",
            "Therapy"};
Arrays.sort(books,
            Comparator.comparing(b -> b.length() >= 4 && b.substring(0, 4).equalsIgnoreCase("the ") ? b.substring(4) : b,
                    String.CASE_INSENSITIVE_ORDER));
System.out.println(Arrays.toString(books));

輸出是

[The Great Gatsby, It, Persuasion, Therapy, The Witches]

您可以通過一個自定義比較器來解決問題。 您可以使用基於SDK的任何一種。

比較器使用Lambda表達式

Comparator<String> c1 
        =  (String o1, String o2)->ignoreThe(o1).compareTo(ignoreThe(o2));

Java SDK的Comaprator v <8

Comparator<String> java7Comparator = new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return ignoreThe(o1).compareTo(ignoreThe(o2));
    }
};

代碼段

import java.util.ArrayList;
import java.util.Comparator;

public class BookComparison {
    public static void main(String[] args) {

        //Comparator using lambda expression
        Comparator<String> javaLambdaCompare 
            =  (String o1, String o2)->ignoreThe(o1).compareTo(ignoreThe(o2));

        //Comaprator for Java v < 7
        Comparator<String> java7Comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return ignoreThe(o1).compareTo(ignoreThe(o2));
            }
        };

        ArrayList<String> books = new ArrayList<String>();
        //Add from source
        books.add("Robinson Crusoe by Daniel Defoe");
        books.add("Gulliver’s Travels by Jonathan Swift");
        books.add("David Copperfield by Charles Dickens");
        books.add("The Scarlet Letter by Nathaniel Hawthorne"); 
        books.add("The Moonstone by Wilkie Collins");
        books.add("Three Men in a Boat by Jerome K Jerome");

        //pass any of the Comparator as an argument to sort
        books.sort(javaLambdaCompare); 
    }
    public static String ignoreThe(String book){
        if(book.length()>=3 && book.substring(0, 3).equalsIgnoreCase("the")){
            book = book.substring(4);
        }
        return book;
    }
}

結果排序列表:

  • 查爾斯·狄更斯(David Dickens)的大衛·科波菲(David Copperfield),
  • 格列佛游記喬納森·斯威夫特(Jonathan Swift)
  • 威爾基·柯林斯(Wilkie Collins)的月光石,
  • 羅賓遜·克魯索(Daniel Defoe)
  • 納撒尼爾·霍桑(Nathaniel Hawthorne)的《紅字》,
  • 三人乘船在傑羅姆·傑羅姆(Jerome K Jerome)

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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