当前位置: 首页 > 知识库问答 >
问题:

如何在不使用java.util.Arrays的情况下对字符串大小写进行不敏感的排序?

公西永嘉
2023-03-14

输入:bbdeaaccc

输出:aabbcccde

我正在尝试对字符串进行大小写排序--不敏感地不导入任何东西。使用java.util.arrays很容易做到这一点,但我想不出没有它的方法。我只把它分类到acdabcce...有什么想法吗?

String str = "bbDeaAcCc";
char[] strArr = str.toCharArray();
char temp = 0;

for (int i = 0; i < str.length(); i++) {
    for (int j = 0; j < str.length(); j++) {
        if (strArr[j] > strArr[i]) { 
            temp = strArr[i];
            strArr[i] = strArr[j];
            strArr[j] = temp;
        }
    }
}

共有1个答案

艾茂学
2023-03-14

作为解决方案之一,您可以使用PriorityQueue

public static String sortIgnoreCase(String str) {
    Queue<Character> queue = new PriorityQueue<>(
          Comparator.comparingInt((ToIntFunction<Character>)Character::toLowerCase)
                    .thenComparingInt(ch -> (int)ch));

    for (int i = 0; i < str.length(); i++)
        queue.add(str.charAt(i));

    StringBuilder buf = new StringBuilder(str.length());

    while (!queue.isEmpty())
        buf.append(queue.remove());

    return buf.toString();
}

如果你只有字母,你可以不使用特殊的结构:

public static String sortIgnoreCase(String str) {
    int[] lowerCase = new int[26];
    int[] upperCase = new int[lowerCase.length];

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);

        if (Character.isLowerCase(ch))
            lowerCase[ch - 'a']++;
        else if (Character.isUpperCase(ch))
            upperCase[ch - 'A']++;
    }

    char[] res = new char[str.length()];

    for (int i = 0, j = 0; i < lowerCase.length; i++) {
        for (int k = 0; k < upperCase[i]; k++)
            res[j++] = (char)(i + 'A');
        for (int k = 0; k < lowerCase[i]; k++)
            res[j++] = (char)(i + 'a');
    }

    return new String(res);
}

最后,使用您的方法,您可以使用insertionsort:

public static String sortIgnoreCase(String str) {
    char[] arr = str.toCharArray();

    for (int i = 0; i < str.length(); i++) {
        for (int j = i; j >= 1; j--) {
            int res = Integer.compare(Character.toLowerCase(arr[j - 1]),
                                      Character.toLowerCase(arr[j]));

            if (res == 0 && arr[j - 1] < arr[j] || res < 0)
                break;

            swap(arr, j - 1, j);
        }
    }

    return new String(arr);
}

private static void swap(char[] arr, int i, int j) {
    char tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
 类似资料:
  • 问题内容: 我一直在寻找一种不用使用collections.sort就可以对数组列表进行排序的方法,因为我自己的逻辑有缺陷,而且我遇到了很多麻烦。 我需要对它进行排序,以便可以使用我创建的一种方法,该方法基本上可以执行collections.swap的工作,以便对数组列表进行完全排序。 这是我的代码: 我对此一直很烦恼。抱歉,这是在伤害社区。 问题答案: 我想,你希望下面的算法:在阵列的其余部分发

  • 问题内容: 我正在寻找Python中忽略大小写字符串的比较。 我尝试过: 但忽略案例没有成功。我需要在给定的文本文件中找到一组单词。我正在逐行读取文件。一行上的单词可以是 mandy , Mandy , MANDY 等(我不想使用/等)。 我正在寻找下面的Perl代码的Python等效项。 问题答案: 如果您不想使用,则可以使用正则表达式:

  • 问题内容: 我尝试使用 OrderBy 从Cloud Firestore读取排序的数据。然后Firestore按照以下顺序返回数据: AAA BBB aaa bbb 现在,我想要的是以下内容: AAA AAA BBB BBB 我只希望使用 OrderBy 而不通过手动排序获得此结果。 在Firestore中,有什么方法可以排序? 请为此提供解决方案。 提前致谢。 问题答案: Cloud Fires

  • 问题内容: 为每个对象提供一种方法,因此给一个类似 一个人可以像 如果传递给的字符串与现有值不匹配(区分大小写),则将引发an 。 要进行不区分大小写的匹配,可以在枚举内编写自定义方法,例如 假设方法是在编译时隐式添加到类中,是否有任何通用方法可以不编写值或任何其他额外对象的缓存,而只编写一次上述方法(例如,不是每个方法)? 这种“通用” 方法的签名将类似于该方法,即: 并且它将为任何对象完全实现

  • 问题内容: 我正在尝试按升序对任意长度整数的数字进行排序,而不使用字符串,数组或递归。 例: 我已经弄清楚如何用模数除法获得整数的每个数字: 但是我不知道如何在没有数组的情况下排序数字。 不用担心上课;这是我们教授给我们的习俗课。 问题答案: 实际上有一个非常简单的算法,它 仅 使用 整数 : 它会打印出来。这个想法很简单: 您将要排序的数字作为当前数字(我们称其为N) 您可以浏览已排序数字中的所

  • 我的问题是我的代码对结果区分大小写。 下面是我的代码: 我的问题是:如何对它进行不区分大小写的排序?