【问题标题】:Sorting array of char using Arrays.sort使用 Arrays.sort 对 char 数组进行排序
【发布时间】:2019-10-18 08:45:13
【问题描述】:

我正在尝试使用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))

我做错了什么? 看起来角色没有自动拆箱。我怎样才能做到这一点?

【问题讨论】:

    标签: java


    【解决方案1】:
    char[] tmpArr = T.toCharArray();
    

    这是错误的,你不能使用比较器的前置词。 您需要将其转换为Character[]

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

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

    Here 是一些很好的转换方式。

    【讨论】:

      【解决方案2】:

      看起来角色没有自动拆箱。

      准确地说,编译时从原始到对象的转换称为装箱。拆箱是相反的方式。
      是的,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 没有提供任何方法来创建 charStream,因为流式传输字符也不是非常传统的需求。
      因此,您没有直接的内置方法来解决您的问题。

      在您的情况下,我将依靠Arrays.stream(String.split()) 为原始字符串的每个字符获取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());
      

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

      【讨论】:

        【解决方案3】:

        public static void sort(T[] a,Comparator 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));
        }
        

        【讨论】:

          【解决方案4】:

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

           Arrays.sort(tmpArr);
          

          所以完整的流程是

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

          【讨论】:

          • 这个问题是关于使用比较器的排序。此流程不适用于相同的情况。
          • @AnkitGarg 是的,我知道当我发布答案时,但我想提供一个更简单的解决方案,因为存在一个。为什么这是错误的,值得投反对票?发布这样的替代答案是很常见的,以防 OP 没有想到这个选项,或者它可能是一个可以帮助其他有类似问题的人的解决方案。
          • 根据您的意图,我已经取消了我的投票,但是我仍然认为您应该提到这个答案是替代答案,并不能解决 OP 提出的问题。否则,它会使整个提要变得复杂,难以找到涵盖实际问题的答案。
          猜你喜欢
          • 2013-09-21
          • 1970-01-01
          • 2012-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-10
          相关资源
          最近更新 更多