有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java按字符串中出现的顺序对字符数组进行排序

如果我有一个用字符填充的字符数组,并且我有一个用一些初始值初始化的String,那么如何确保数组中的字符按照它们在字符串中的出现顺序进行排序

您可以做出以下附加假设:

  • 未使用的字符应按其原始顺序显示在末尾
  • 如果同一字符在数组中多次出现,则它们可以引用字符串中的同一个出现

例如,假设以下两个初始化变量:

char [] arr= new char[5] { 'a', 'd', 'v', 'd', 'j' };
String str = "dad";

然后,预期的结果是变量arr将对字符进行如下排序:

{ 'd', 'a', 'd', 'v', 'j' }

共 (2) 个答案

  1. # 1 楼答案

    以下是一个可能的解决方案:

    public static void main(String[] args) throws IOException  {
        char [] arr= { 'a', 'd', 'v', 'd', 'j' };
        String str = "dad";
        int pos = 0;
        for (char c: str.toCharArray()) {
            int i = locate(c, arr, pos);
            if (i >= 0) {
                char x = arr[pos];
                arr[pos] = arr[i];
                arr[i] = x;
                ++pos;
            }
        }
        System.out.println(toString(arr));
    }
    
    private static int locate(char c, char[] arr, int start) {
        for (int i = start; i < arr.length; ++i) {
            if (arr[i] == c) {
                return i;
            }
        }
        return -1;
    }
    

    更新:toString方法

    private static String toString(char[] arr) {
        StringBuilder buf = new StringBuilder();
        buf.append('{');
        boolean first = true;
        for (char c: arr) {
            if (first) {
                first = false;
            } else {
                buf.append(',');
            }
            buf.append(c);
        }
        buf.append('}');
        return buf.toString();
    }
    

    更新2:保留不在字符串中的元素的顺序

            if (i >= 0) {
                char x = arr[i];
                for (int k = pos; k < i; ++k) {
                    char y = arr[k];
                    arr[k] = x;
                    x = y;
                }
                arr[i] = x;
                ++pos;
            }
    
  2. # 2 楼答案

    我写的这个解决方案(部分)解决了这个问题

        String source = "pippo";
        Comparator<Character> comparator = new Comparator<Character>() {
    
            private int countChar(String s, char c) {
                return s.length() - s.replace(Character.toString(c), "").length();
            }
            @Override
            public int compare(Character o1, Character o2) {
                return countChar(source, o2) - countChar(source, o1);
            }
        };
        Character[] charObjectArray = source.chars().mapToObj(c -> (char)c).toArray(Character[]::new);
        Arrays.sort(charObjectArray , comparator);
    

    仍然缺少的是此功能的实现:

    if multiple occurrences of the same character occur within the array, they can refer to the same occurrence within the string.

    此处找到了计算字符串中字符出现次数的方法:https://stackoverflow.com/a/8910767/379173