繁体   English   中英

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

[英]Sorting array of char using Arrays.sort

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

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

我究竟做错了什么? 似乎没有自动取消装箱到角色。 我该如何进行这项工作?

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

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

您不能使用基元,比较器仅适用于对象。

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

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

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

这是错误,您不能在比较器中使用谓词。 您需要将其转换为Character[]

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

char[] charArray = str.toCharArray();
Character[] tmpArr = ArrayUtils.toObject(charArray);

这里有一些转换的好方法。

char []已经存在一种排序方法,因此

 Arrays.sort(tmpArr);

所以完整的流程是

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

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

确切地说,在编译时从原始对象到对象的转换称为装箱。 拆箱是相反的方法。
是的, 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

我该如何进行这项工作?

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

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

String originalValue = "...";
String afterSortValue =
    Arrays.stream(originalValue.split(""))
          .sorted((o1, o2) -> {
                    Integer aPos = poses.get(o1);
                    Integer bPos = poses.get(o2);
                    if (aPos == null || bPos == null)
                      return 0;
                    return Integer.compare(aPos, bPos);
                  }
          )
         .collect(Collectors.joining());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM