Java 如何对字母数字字符串排序并更改顺序?
如果是重复的问题,请建议我链接 我的代码是Java 如何对字母数字字符串排序并更改顺序?,java,arrays,sorting,Java,Arrays,Sorting,如果是重复的问题,请建议我链接 我的代码是 public static void main(String[] args) { String name ="h498y948759hrh98A722hjDF94yugerTEr892ur48y"; char[] arr= name.toCharArray(); Arrays.sort(arr); System.out.println(arr); } 结果是 22244445778888899999
public static void main(String[] args) {
String name ="h498y948759hrh98A722hjDF94yugerTEr892ur48y";
char[] arr= name.toCharArray();
Arrays.sort(arr);
System.out.println(arr);
}
结果是
222444457788888999999ADEFTeghhhhjrrrruuyyy
现在我想改变这个排序的顺序
ADEFT2244445778889999EGHHHJRRRUUYY或
EGHHHJRRRUUYY2224445778889999DEFT
所以问题是我怎样才能改变这个顺序?
如果这是错误的分类方法,请告诉我正确的方法
谢谢您可以创建自己的
比较器
类/对象,并将其传递给Arrays.sort()
。不幸的是,您还需要将元素转换为字符
但是,最常用的方法可能是将每个字符视为字符串
,并使用排序符
,如下例所示:
// Rules separated in 3 parts only for convenience
String rules1= "< A < B < C < D < E < F < G < H < I < J < K < L < M < N < O < P < Q < R < S < T < U < V < W < X < Y < Z" ;
String rules2= "< a < b < c < d < e < f < g < h < i < j < k < l < m < n < o < p < q < r < s < t < u < v < w < x < y < z" ;
String rules3= "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9" ;
RuleBasedCollator collator= new RuleBasedCollator(rules1+rules2+rules3) ;
String input= "h498y948759hrh98A722hjDF94yugerTEr892ur48y" ;
// Bulk of the job done here
String[] arr= input.split("") ;
Arrays.sort(arr,1,arr.length,collator);
// Join back in a single string for presentation
StringBuilder sb= new StringBuilder() ;
for(String e: arr )
sb.append( e );
System.out.println(sb);
仅将排序规则更改为
String rules1= "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9" ;
String rules2= "< A,a < B,b < C,c < D,d < E,e < F,f < G,g < H,h < I,i < J,j < K,k < L,l < M,m < N,n < O,o < P,p < Q,q < R,r < S,s < T,t < U,u < V,v < W,w < X,x < Y,y < Z,z" ;
RuleBasedCollator collator= new RuleBasedCollator(rules1+rules2) ;
Collator
s的主要优点是允许根据内部规则对多个字符串进行排序。事实上,这是它们的主要用例
相当强大,是吗?(是的,如果你没猜到的话,我是加拿大人:-)我写了一些示例来演示
比较器的概念。它要求:
import java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
导入com.google.common.collect.ComparisonChain;
导入com.google.common.primitives.Chars;
公开课考试{
私有枚举比较器实现比较器{
上\位\下{
@凌驾
int比较(字符左侧、字符右侧){
返回ComparisonChain.start()
.compareTrueFirst(Character.isUpperCase(lhs)、Character.isUpperCase(rhs))
.compareTrueFirst(Character.isDigit(lhs)、Character.isDigit(rhs))
.compareTrueFirst(Character.isLowerCase(lhs)、Character.isLowerCase(rhs))
.比较(左、右)
.result();
}
},
下位数字上位数字{
@凌驾
int比较(字符左侧、字符右侧){
返回ComparisonChain.start()
.compareTrueFirst(Character.isLowerCase(lhs)、Character.isLowerCase(rhs))
.compareTrueFirst(Character.isDigit(lhs)、Character.isDigit(rhs))
.compareTrueFirst(Character.isUpperCase(lhs)、Character.isUpperCase(rhs))
.比较(左、右)
.result();
}
};
@凌驾
公共整数比较(字符lhs、字符rhs){
返回比较(lhs.charValue(),rhs.charValue());
}
抽象整数比较(字符lhs、字符rhs);
}
私有静态字符串sortChars(字符串str、比较器cmp){
List chars=chars.asList(str.tocharray());
集合。排序(字符、cmp);
返回新字符串(Chars.toArray(Chars));
}
公共静态void main(字符串[]args){
字符串名称=“H498Y948759HRH98A72HJDF94YUGER892UR48Y”;
System.out.println(sortChars(名称、比较器、上下数字));
System.out.println(sortChars(名称、比较器、低位数字、高位数字));
}
}
是的,但是您必须首先将字符[]
转换为字符[]
,因为数组。sort(char[])
没有使用比较器的版本(因为比较器不能处理基元类型)。+1用于使用基于排序的方法;我已经很久没有看到任何使用项圈的东西了。还有,我肯定错过了什么;我看不出你的回答(除了最后一句)有任何暗示你是加拿大人的地方,除非“相当强大,呃”应该是加拿大的成语或其他什么-(顺便说一句,我是新西兰人。)@ChrisJester-Young根据流行文化,我们倾向于在每个句子的末尾加上“呃?”。“但是我们很幽默,嗯?”VeronicaCornejo Lol。我敢肯定新西兰人和英国人也经常用“嗯”结尾,所以我经常听到,嗯?:-P@VeronicaCornejocollator可以用于字母数字排序吗?这可能不是OP希望回答的问题的一部分,但我相信这是使用基于collator的方法的一个限制?
String rules1= "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9" ;
String rules2= "< A,a < B,b < C,c < D,d < E,e < F,f < G,g < H,h < I,i < J,j < K,k < L,l < M,m < N,n < O,o < P,p < Q,q < R,r < S,s < T,t < U,u < V,v < W,w < X,x < Y,y < Z,z" ;
RuleBasedCollator collator= new RuleBasedCollator(rules1+rules2) ;
222444457788888999999ADEeFghhhhjrrrrTuuyyy
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.common.collect.ComparisonChain;
import com.google.common.primitives.Chars;
public class Test {
private enum Comparators implements Comparator<Character> {
UPPER_DIGIT_LOWER {
@Override
int compare(char lhs, char rhs) {
return ComparisonChain.start()
.compareTrueFirst(Character.isUpperCase(lhs), Character.isUpperCase(rhs))
.compareTrueFirst(Character.isDigit(lhs), Character.isDigit(rhs))
.compareTrueFirst(Character.isLowerCase(lhs), Character.isLowerCase(rhs))
.compare(lhs, rhs)
.result();
}
},
LOWER_DIGIT_UPPER {
@Override
int compare(char lhs, char rhs) {
return ComparisonChain.start()
.compareTrueFirst(Character.isLowerCase(lhs), Character.isLowerCase(rhs))
.compareTrueFirst(Character.isDigit(lhs), Character.isDigit(rhs))
.compareTrueFirst(Character.isUpperCase(lhs), Character.isUpperCase(rhs))
.compare(lhs, rhs)
.result();
}
};
@Override
public int compare(Character lhs, Character rhs) {
return compare(lhs.charValue(), rhs.charValue());
}
abstract int compare(char lhs, char rhs);
}
private static String sortChars(String str, Comparator<Character> cmp) {
List<Character> chars = Chars.asList(str.toCharArray());
Collections.sort(chars, cmp);
return new String(Chars.toArray(chars));
}
public static void main(String[] args) {
String name = "h498y948759hrh98A722hjDF94yugerTEr892ur48y";
System.out.println(sortChars(name, Comparators.UPPER_DIGIT_LOWER));
System.out.println(sortChars(name, Comparators.LOWER_DIGIT_UPPER));
}
}