有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用数组按字母顺序排列字符串。排序()?

我正在为考试复习问题,其中一个问题要求我按书名的字母顺序排列。我被要求忽略“the”一词,如果它出现在标题的开头。我的问题是,有没有一种方法可以对书籍的标题顺序进行排序,同时使用数组忽略“the”。排序()

最初,我将书籍放入一个名为书籍的数组列表中,然后应用:

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) 个答案

  1. # 1 楼答案

    你可以通过一个定制的比较器来实现这一点。您可以使用基于SDK的任何一个

    使用lambda表达式的比较器

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

    Java SDK的Comaprator v<;八,

    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;
        }
    }
    

    结果排序列表:

    • 查尔斯·狄更斯的大卫·科波菲尔
    • 乔纳森·斯威夫特的《格列佛游记》
    • 威尔基·柯林斯的《月亮石》
    • 丹尼尔·笛福的《鲁滨逊漂流记》
    • 纳撒尼尔·霍桑的《红字》
    • 船上的三个人Jerome K Jerome

    希望这有帮助

  2. # 2 楼答案

    你得稍微小心一点

    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));
        }
    });
    

    在Java8中,您不需要像只需这样的助手方法

    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]