问题描述
- 麻烦大伙帮忙用Collections.sort 排序一下 这个自定义的属性
-
List glass = new ArrayList(glassesRefractionCollections);
Collections.sort(glass, new Comparator() {
@Override
public int compare(R g1, R g2) {return //请看底下的排列顺序 } });
要按照这个顺序排序
cycloplegic, manual, refracting station, autorefraction, retinoscopy
请问怎么实现啊。。。上面那个顺序一点规律都没有。。。
解决方案
wc,这个是脑筋急转弯的题目,从目前的趋势来看,貌似是逆转字符串排序
public int compare(R g1, R g2) {
StringBuilder sb1 = new StringBuilder( (String)g1);
StringBuilder sb2 = new StringBuilder( (String)g2);
return sb1.reverse().toString().compareTo(sb2.reverse().toString());
}
解决方案二:
先将字符串反转,再进行比较。
public static void main(String[] args) {
String str = "abc????????";
char[] c = str.toCharArray();
sort(c);
String out = new String(c);
System.out.println(str);
System.out.println(out);
}
private static void sort(char[] c) {
int start = -1; // 需要反转部分的起始下标 不需要反转时设为-1
boolean flag = false; // 是否是阿拉伯语字符的标志
for (int i = 0; i < c.length; i++) {
flag = isArabic(c[i]); // 判断当前字符是否是阿拉伯语字符
if (start != -1 && !flag) { // 如果之前已经检测到了阿拉伯语字符 且当前字符不是阿拉伯语字符;
reverse(c, start, i);
start = -1;
}
if (start == -1 && flag) { // 如果之前未检测到阿拉伯语字符 且当前字符是阿拉伯语字符
start = i;
}
}
if (start != -1) {
reverse(c, start, c.length);
start = -1;
}
}
/**
* 将字符数组的指定部分反转
*
* @param c 需要反转的字符串数组
* @param start 需要反转部分的起始下标
* @param end 需要反转部分的结束下标
*/
private static void reverse(char[] in, int start, int end) {
System.out.println("Do reverse between " + start + " , " + end);
int n = (end - start) / 2; // 计算交换次数
for (int i = 0; i < n; i++) { // 交换
char t = in[start + i];
in[start + i] = in[end - i - 1];
in[end - i - 1] = t;
}
}
/**
* 判断输入的字符是否是阿拉伯字符
*
* @param c 输入的字符
* @return 是阿拉伯字符返回true 不是返回false
*/
private static boolean isArabic(char c) {
int u = c;
if (0x0600 <= u && 0x06FF >= u) { // 如果是Unicode码表 阿拉伯文 0600-06FF区间
return true;
}
if (0x0750 <= u && 0X077F >= u) { // 如果是Unicode码表 阿拉伯文补充 0750-077F区间
return true;
}
return false;
}
时间: 2024-12-22 03:04:42