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

时间:2015-11-16 18:57:19

标签: java arrays sorting alphabetical alphabetical-sort

我正在研究考试的复习问题,其中一个问题要求我按顺序对书名进行按字母顺序排列。如果它出现在标题的开头,我被要求忽略""这个词。我的问题是,有没有办法对图书的标题顺序进行排序,同时忽略了""使用Arrays.sort()?

最初我将这些书放在名为 books 的数组列表中,然后应用:

Arrays.sort(books);

它起作用但只是在某种程度上,因为它不会忽视""。相反,做得更好:

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

然后比较每本书的第一个字母以输出升序?

我想知道是否有更简单的方法可以解决这个问题。任何线索或建议将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

你必须要小心。

  1. book.substring(0, 3)会为长度小于3的字符串抛出StringIndexOutOfBoundsException
  2. "the"开头的标题不一定以“The”开头。例如,它可以以“那里”开头。
  3. 如果您使用的是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]
    

答案 1 :(得分:0)

您可以传递一个自定义Comparator来实现这一目的。您可以使用基于SDK的任何一个。

使用lambda表达式的比较器

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

Java SDK的Comaprator v&lt; 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;
    }
}

结果排序列表:

  • 查尔斯狄更斯的大卫科波菲尔,
  • 格列佛的游记Jonathan Swift,
  • 威尔基柯林斯的月光石,
  • Robinson Crusoe,Daniel Defoe,
  • Nathaniel Hawthorne的红字,
  • 杰罗姆·K·杰罗姆在船上的三名男子

希望这有帮助!