按预定义的自定义顺序排序字符串列表
我有这个项目,程序会询问用户应该运行多少次。 在每次运行期间,将创建一个列表并添加元素。 数组中的这些元素按字母顺序排序,但按以下顺序排序:
q,w,e,r,t,y,u,i,o,p,l,k,j,h,g,f,d,s,a,z,x,c,v,b,n,m
我可以运行我的程序直到它接受输入,但我不知道接下来该做什么…
样本输入
2 3 what are you 2 sad set
样本输出
what you are set sad
这是我的代码:
import java.util.*; public class WeirdWritings { public static void main(String[] args) { int data,word,ctr,i,ii; char[] rLetter = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'}; String entry; Scanner s = new Scanner(System.in); data=s.nextInt(); for (ctr=0;ctr<rLetter.length;ctr++) System.out.print(rLetter[ctr]); System.out.println(); for (ii = 0; ii<data; ii++) { word=s.nextInt(); List array_ii = new ArrayList(); for(i=0; i<word; i++) { entry=s.next(); array_ii.add(entry); } } } }
将比较器添加到其中以完成它
公共类MyComparator实现Comparator {
private int[] charRank; public MyComparator() { char[] charOrder = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'}; this.charRank = new int[26]; for(int i=0; i<25; i++) { this.charRank[charToInt(charOrder[i])] = i; } } public int compare(String s1, String s2) { // returns // Positive integer if s1 greater than s2 // 0 if s1 = s2 // Negative integer if s1 smaller than s2 s1 = s1.toUpperCase(); s2 = s2.toUpperCase(); int l = Math.min(s1.length(), s2.length()); int charComp; for(int i=0; i<l; i++) { charComp = this.charRank[charToInt(s1.charAt(i))] - charRank[charToInt(s2.charAt(i))]; if(charComp != 0) return charComp; } return s1.length() - s2.length(); } //works for c between 'A' and 'Z' - upper case letters private static int charToInt(char c) { return c - 65; } //works for 0<=i<=25 private static char intToChar(int i) { return (char) (i + 65); } public static void main(String[] args) { int data,word,ctr,i,ii; char[] rLetter = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'}; String entry; Scanner s = new Scanner(System.in); data=s.nextInt(); for (ctr=0;ctr<rLetter.length;ctr++) System.out.print(rLetter[ctr]); System.out.println(); for (ii = 0; ii<data; ii++) { word=s.nextInt(); String[] array_ii = new String[word]; for(i=0; i<word; i++) { entry=s.next(); array_ii[i]=(entry); } Arrays.sort(array_ii, new MyComparator()); for(i=0; i<word; i++) { System.out.println(array_ii[i]); } } }
}
您可以构建自己的比较器:
import java.util.Comparator; public class MyComparator implements Comparator { private int[] charRank; public MyComparator() { char[] charOrder = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'}; this.charRank = new int[26]; for(int i=0; i<25; i++) { this.charRank[charToInt(charOrder[i])] = i; } } public int compare(String s1, String s2) { // returns // Positive integer if s1 greater than s2 // 0 if s1 = s2 // Negative integer if s1 smaller than s2 s1 = s1.toUpperCase(); s2 = s2.toUpperCase(); int l = Math.min(s1.length(), s2.length()); int charComp; for(int i=0; i
然后,你只需要运行:
Arrays.sort(entryArray, new MyComparator());
现在有些解释。
MyComparator的构造函数为每个字母构建一个排列数组。 在实践中,它将从{18, 23, 21, ... }
因为'A'位于第18位,'B'位于第23位......
然后,当您比较两个字符串s1
和s2
,字符将按字典顺序逐个进行比较。
- 想象一下前
n
字符是相同的,现在,你比较c1
和c2
。 如果c1
的等级低于c2
等级,那么你必须返回一个负整数,因为s1
在字典顺序中位于s2
之前(s1
小于s2
)。 如果c1
的等级大于c2
的等级,则相反。 如果两个等级都等于c1
且c2
等于并且你必须查看下一个字符。 - 如果到达一个字符串的末尾,则两个字符串都是等号,或者一个字符串是另一个字符串的前缀。 在每种情况下,足以比较字符串的长度:如果
s1
较短,它首先在字典顺序中,它是较小的,你必须返回一个负整数。
你走了 我希望这是你在等待的。
@Edit: s1 = s1.toUpperCase()
只是为了避免区分大写和小写字母的痛苦。 如果您更喜欢使用小写字母,只需将其更改为s1 = s1.toLowerCase()
,将intToChar
方法intToChar
为return c-97
(ascii代码为小写'a')并自然地指定charOrder
数组使用小写字母的构造函数。