用大写小写和数字排序字符串

时间:2018-09-25 14:24:14

标签: java string sorting

在Java中以小写字母和数字排序字符串 aAbcB1C23。 回答ABCabc123。

我尝试对数组进行升序和降序排序,但没有像ABC进入中间的两种方式一样起作用。有任何想法吗 ?

我想用O(1)辅助空间求解,可能是O(n log n)时间..

public class SortTheGivenStringAlphabetically {
    public static void performAction() {
        String input = "aAbcB1C23";
        char[] inputCharArray = input.toCharArray();
        sort(inputCharArray, 0, (inputCharArray.length) - 1);

        for (int i = 0; i < inputCharArray.length; i++) {
            System.out.println(inputCharArray[i]);
        }

    }

    public static void sort(char[] array, int low, int high) {
        if (low < high) {
            int pi = partition(array, low, high);
            sort(array, low, pi - 1);
            sort(array, pi + 1, high);
        }
    }

    private static int partition(char[] array, int low, int high) {
        int pivot = array[high];
        int i = low - 1;
        for (int j = low; j < high; j++) {
            if (array[j] <= pivot) {
                i++;
                char temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
        char temp = array[i + 1];
        array[i + 1] = array[high];
        array[high] = temp;
        return i + 1;
    }

    public static void main(String[] args) {
        performAction();
    }
}

4 个答案:

答案 0 :(得分:2)

  • 创建3个ArrayList
  • 从输入中分离所有字符,并将它们添加到特定的ArrayList
  • 然后使用Collections.sort()对它们进行排序。
  • 最后按所需顺序组合所有字符。

String input = "aAbcB1C23";
ArrayList<Character> capital = new ArrayList(),
        simple = new ArrayList(),
        numbers = new ArrayList();

for (Character c : input.toCharArray()) {
    if (Character.isLetter(c)) {
        if (Character.isUpperCase(c)) {
            capital.add(c);
        } else {
            simple.add(c);
        }
    } else {
        numbers.add(c);
    }
}

Collections.sort(simple);
Collections.sort(capital);
Collections.sort(numbers);

StringBuilder output = new StringBuilder();

for (Character c : capital) {
    output.append(c);
}
for (Character c : simple) {
    output.append(c);
}
for (Character c : numbers) {
    output.append(c);
}

System.out.println(output.toString());

输出:

ABCabc123

答案 1 :(得分:1)

意思是自然顺序为'1' (49) < 'A' (65) < 'a' (97)

    String input = "aAbcB1C23"; // Sorted: ABCabc123
    char[] array = input.toCharArray();
    sort(array, 0, (array.length) - 1);

所以您可以重新排序错误排序的结果:

output = output.replaceFirst("^([0-9]*)([A-z]*)$", "$2$1");

或将每个有关的char映射到正确的值:最简单的功能是

int value(char ch) {
    if ('A' <= ch && ch <= 'Z') {
        return 100 + (ch - 'A');
    } else if ('a' <= ch && ch <= 'z') {
        return 200 + (ch - 'a');
    } else if ('0' <= ch && ch <= '9') {
        return 300 + (ch - '0');
    } else {
        return 400 + (int) ch;
    }
}

现在比较value(array[i])

答案 2 :(得分:0)

一种选择是在进行比较时使用字符的整数值。为了使数字显示在末尾,我们可以为其添加一些固定值(例如100)。

public static void main(String[] args) {
    String input = "aAbcB1C23";
    char[] charArray = input.toCharArray();
    Character[] charObjectArray = ArrayUtils.toObject(charArray);

    Arrays.sort(charObjectArray, new Comparator<Character>() {
        @Override
        public int compare(Character o1, Character o2) {
            Integer i1 = convert(Integer.valueOf(o1));
            Integer i2 = convert(Integer.valueOf(o2));
            return i1.compareTo(i2);
        }

        private Integer convert(Integer original) {
            if (original < 58) {
                return  original + 100;
            }
            return original;
        }
    });

    System.out.println(new String(ArrayUtils.toPrimitive(charObjectArray)));
}

答案 3 :(得分:0)

第一个循环对String中存在的字符号进行无数次迭代,最后两个循环运行恒定时间(78次),因此从时间复杂度的角度来看可能是有效的。

   public static String SortSstring(String input) {
        int []intArr=new int[78];
        for(int i=0;i<input.length();i++)
            intArr[input.charAt(i)-48] ++;
        String OutputString="";
        for(int i=17;i<78;i++){
            OutputString+=String.valueOf(new char[intArr[i]]).replace('\0', (char)(i+48));
        }
        for(int i=0;i<10;i++){
            OutputString+=String.valueOf(new char[intArr[i]]).replace('\0', (char)(i+48));
        }
        return OutputString;
    }
    }