按字符串中出现的顺序排序字符数组

时间:2017-01-17 05:58:46

标签: java sorting

如果我有一个填充了字符的字符数组,并且我初始化了一些初始值String,那么我怎样才能确保数组中的字符按照如何排列的顺序排序它们出现在字符串中。

您可以做出以下额外假设:

  • 未使用的字符应按原始顺序显示在最后。
  • 如果数组中出现多个相同字符,则它们可以引用字符串中的相同匹配项。

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

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

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

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

2 个答案:

答案 0 :(得分: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;
        }

答案 1 :(得分:0)

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

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

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

  

如果数组中出现多次相同的字符,   他们可以在字符串中引用相同的事件。

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