admin
2021-07-08 1764c1784a4cf1a6afd25fcf1a0eef6187a84218
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package com.tejia.lijin.app.util;
 
import java.util.Arrays;
import java.util.List;
 
/**
 * Created by weikou2015 on 2017/3/7.
 */
 
public class Sort {
 
    /**
     * 调用此方法
     *
     * @param list
     * @return
     */
    public static List<String> listSort(List<String> list) {
        String[] array = list.toArray(new String[list.size()]);
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if (singleSort(array[i], array[j]) == 1) {
                    String temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
        return Arrays.asList(array);
    }
 
    /**
     * 比较两个字符
     *
     * @param one
     * @param two
     * @return
     */
    public static int singleSort(String one, String two) {
        int[] left = stringToAscii(one);
        int[] right = stringToAscii(two);
        int size = left.length < right.length ? left.length : right.length;
        for (int i = 0; i < size; i++) {
            // 大于10000说明是汉字 并且在判断一下是否相等 不相等在判断 减少判断次数
            if (left[i] > 10000 && right[i] > 10000 && left[i] != right[i]) {
                if (chineseCompare(one, two, i) != 0) {
                    return chineseCompare(one, two, i);
                }
            } else {
                if (intCompare(left[i], right[i]) != 0) {
                    return intCompare(left[i], right[i]);
                }
            }
        }
        return intCompare(left.length, right.length);
    }
 
    /**
     * 汉字比较
     *
     * @param one
     * @param two
     * @param i
     * @return
     */
    private static int chineseCompare(String one, String two, int i) {
        String substringleft;
        String substringright;
        if (i > 0) {
            substringleft = one.substring(i - 1, i);
            substringright = two.substring(i - 1, i);
        } else {
            substringleft = one.substring(0, i);
            substringright = two.substring(0, i);
        }
        // 获得汉字拼音首字母的ASCII码
        // 把他里面的CharacterParser.convert方法 改成 public static 不然会报错
        int subLeft = stringToAscii(CharacterParser.convert(substringleft)
                .substring(0, 1))[0];
        int subRight = stringToAscii(CharacterParser.convert(substringright)
                .substring(0, 1))[0];
        System.out.println(CharacterParser.convert(substringleft).substring(0,
                1));
        return intCompare(subLeft, subRight);
    }
 
    /**
     * 数字比较
     *
     * @param subLeft
     * @param subRight
     * @return
     */
    private static int intCompare(int subLeft, int subRight) {
        if (subLeft > subRight) {
            return 1;
        } else if (subLeft < subRight) {
            return -1;
        } else {
            return 0;
        }
    }
 
    /**
     * 获得ASCII码
     *
     * @param value
     * @return
     */
    public static int[] stringToAscii(String value) {
        char[] chars = value.toCharArray();
        int j = chars.length;
        int[] array = new int[j];
        for (int i = 0; i < chars.length; i++) {
            array[i] = (int) chars[i];
        }
        return array;
    }
}