使用Arrays.sort对char数组进行排序

时间:2019-06-02 15:31:55

标签: java

我正在尝试使用Arrays.sort函数对char数组进行排序。 我正在使用以下代码:

class Solution {
    public String customSortString(String S, String T) {
        Map<Character, Integer> poses = new HashMap<>(S.length());

        for(int i = 0 ; i < S.length() ; i++){
            poses.put(S.charAt(i), i);
        }

        char[] tmpArr = T.toCharArray();

        Arrays.sort(tmpArr , new Comparator<Character>(){ 

            @Override
            public int compare(Character c1, Character c2) {   
                Integer aPos = poses.get(c1);
                Integer bPos = poses.get(c2);

                if(aPos == null || bPos == null)
                    return 0;

                return Integer.compare(aPos,bPos);
            } 
        });

        return new String(tmpArr);

    }
}

但是我遇到了这个错误:

Error:(14, 19) java: no suitable method found for sort(char[],<anonymous java.util.Comparator<java.lang.Character>>)
    method java.util.Arrays.<T>sort(T[],java.util.Comparator<? super T>) is not applicable
      (inference variable T has incompatible bounds
        equality constraints: char
        upper bounds: java.lang.Character,java.lang.Object)
    method java.util.Arrays.<T>sort(T[],int,int,java.util.Comparator<? super T>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length))

我在做什么错? 似乎没有自动取消装箱到角色。我该如何工作?

4 个答案:

答案 0 :(得分:1)

  

公共静态无效排序(T [] a,比较器c)

     

根据由引起的顺序对指定的对象数组进行排序   指定的比较器。

您不能使用基元,Comparator仅适用于对象。

char是Java中的原始数据类型,因此您应将tmpArr更改为:

Character[] tmpArr = new Character[T.length()];

for (int i = 0; i < T.length(); i++) {
    tmpArr[i] = new Character(T.charAt(i));
}

答案 1 :(得分:1)

$startvar = 'param\":{this_is_long_string}';
$look4    = 'param\":{';
$changed  = str_replace($look4,$look4 . '[',$startvar) . ']';
echo $changed;

这是错误,您不能在比较器中使用谓词。 您需要将其转换为char[] tmpArr = T.toCharArray();

您可以使用Apache commons-lang进行以下操作:

Character[]

Here是一些转换的好方法。

答案 2 :(得分:1)

已经存在char []的排序方法,所以

 Arrays.sort(tmpArr);

所以完整的流程是

char[] tmpArr = T.toCharArray();
Arrays.sort(tmpArr);
return new String(tmpArr);

答案 3 :(得分:1)

  

似乎没有自动取消装箱角色。

确切地说,在编译时从原始对象到对象的转换称为装箱。拆箱是相反的方法。
是的,Character/char提供了自动装箱功能,但不能以这种方式工作。这里的原语/包装器对应物位于数组或列表中:因此此处没有装箱的可能。

可以编译:

char a = Character.valueOf('a'); // compile
Character aa  = 'a'; // compile

但这不是:

List<Character> charList = ...;
char[] charArray= ...;
charList = charArray; // doesn't compile
charArray = charList; // doesn't compile
  

我该如何做?

用特定的charComparator数组进行排序是不常见的。
因此Arrays API不提供这种方法也就不足为奇了。
通常,ComparatorComparable实现仅依赖于比较对象的状态来返回结果,而不像示例中那样依赖外部变量。
同样,Arrays API也没有提供创建Stream的{​​{1}}的任何方法,因为流字符也不是很常规的需求。
因此,您没有直接解决问题的内置方法。

在您的情况下,我将依靠char为原始String的每个字符获取一个Arrays.stream(String.split()),然后应用排序并以一个连接结尾:

String

这应该是不使用外部库的最直接方法。