麻烦大伙帮忙用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

请问怎么实现啊。。。上面那个顺序一点规律都没有。。。

2个回答

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());
}

eagleyan
Coursera 回复kaseyhebe: 类型转换失败,那证明你的数据不是字符串,你可以试试g1.toString();你看的懂我的代码,你能找到解决办法
大约 5 年之前 回复
kaseyhebe
kaseyhebe 不太对呀 大神。 (String)r1) 报错说 inconvertible type 这个是我工作项目中的问题。。。不是脑筋急转弯
大约 5 年之前 回复
PrisonBreak_
愤怒的根号三 怎么回事儿?
大约 5 年之前 回复

先将字符串反转,再进行比较。

 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;
    }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问