我有这个项目,程序会询问用户应该运行多少次。在每次运行期间,将创建一个列表并添加元素。数组中的这些元素按字母顺序排序,但按以下顺序排序:
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<String> array_ii = new ArrayList<String>();
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]);
}
}
}
}
答案 0 :(得分:0)
您可以构建自己的比较器:
import java.util.Comparator;
public class MyComparator implements Comparator<String> {
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);
}
}
然后,你只需要运行:
Arrays.sort(entryArray, new MyComparator());
现在有一些解释。
MyComparator的构造函数为每个字母构建一个排名数组。在实践中,它将以{18, 23, 21, ... }
开头,因为&#39; A&#39;排在第18位,&#39; B&#39;在23日...
然后,当您比较两个字符串s1
和s2
时,字符将按字典顺序逐个进行比较。
n
字符是相同的,现在,您要比较c1
和c2
。如果c1
的排名低于c2
的排名,则必须返回一个负整数,因为s1
位于词典顺序s2
之前{{1} }}小于s1
)。如果s2
的排名大于c1
的排名,则相反。如果两个等级都等于c2
且c1
等于,则必须查看下一个字符。c2
较短,它首先出现在字典顺序中,它更小,你必须返回一个负整数。你走了。我希望这是你在等待的。
@Edit:s1
只是为了避免区分大写和小写字母的痛苦。如果您希望使用小写字母,只需将其更改为s1 = s1.toUpperCase()
,将方法s1 = s1.toLowerCase()
更改为intToChar
(ascii代码为小写&#39; a&#39;)当然,使用小写字母在构造函数中指定return c-97
数组。