如何使用 Arrays.sort() 按字母顺序排列字符串的顺序?
How do you alphabetize the order of Strings using Arrays.sort()?
我正在做考试的复习题,其中一个问题要求我按书名的字母顺序排列。如果 "The" 出现在标题的开头,我会被要求忽略它。我的问题是,有没有一种方法可以在忽略 "The" 的同时使用 Arrays.sort() 对书籍的标题顺序进行排序?
最初我将书放在一个名为 books 的数组列表中,然后应用:
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
然后比较每本书的首字母输出升序?
我想知道是否有更简单的方法来解决这个问题。任何线索或建议将不胜感激。谢谢。
你要稍微小心一点。
book.substring(0, 3)
对长度小于 3 的字符串抛出 StringIndexOutOfBoundsException
。
- 以
"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]
您可以传递一个自定义的 Comparator 来达到目的。您可以使用基于SDK的任何一个。
使用 lambda 表达式的比较器
Comparator<String> c1
= (String o1, String o2)->ignoreThe(o1).compareTo(ignoreThe(o2));
Java SDK 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;
}
}
结果排序列表:
- 查尔斯·狄更斯的大卫·科波菲尔,
- 乔纳森的《格列佛游记》Swift、
- 威尔基柯林斯的月光石,
- 丹尼尔·笛福的鲁滨逊漂流记,
- 纳撒尼尔霍桑的红字,
- 杰罗姆·K·杰罗姆的《三人同舟》
希望对您有所帮助!
我正在做考试的复习题,其中一个问题要求我按书名的字母顺序排列。如果 "The" 出现在标题的开头,我会被要求忽略它。我的问题是,有没有一种方法可以在忽略 "The" 的同时使用 Arrays.sort() 对书籍的标题顺序进行排序?
最初我将书放在一个名为 books 的数组列表中,然后应用:
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
然后比较每本书的首字母输出升序?
我想知道是否有更简单的方法来解决这个问题。任何线索或建议将不胜感激。谢谢。
你要稍微小心一点。
book.substring(0, 3)
对长度小于 3 的字符串抛出StringIndexOutOfBoundsException
。- 以
"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]
您可以传递一个自定义的 Comparator 来达到目的。您可以使用基于SDK的任何一个。
使用 lambda 表达式的比较器
Comparator<String> c1
= (String o1, String o2)->ignoreThe(o1).compareTo(ignoreThe(o2));
Java SDK 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;
}
}
结果排序列表:
- 查尔斯·狄更斯的大卫·科波菲尔,
- 乔纳森的《格列佛游记》Swift、
- 威尔基柯林斯的月光石,
- 丹尼尔·笛福的鲁滨逊漂流记,
- 纳撒尼尔霍桑的红字,
- 杰罗姆·K·杰罗姆的《三人同舟》
希望对您有所帮助!