Sortarea matricei de caractere folosind Arrays.sort (Programare, Java)

restfulblue a intrebat.

Încerc să sortez array de char folosind Arrays.sort function.I’m folosind următorul cod:

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

    }
}

Dar primesc această eroare:

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

Ce fac greșit?Se pare că nu există nici o desfacere automată pentru Character. Cum pot să fac să funcționeze acest lucru?

4 răspunsuri
davidxxx

Se pare că nu există un unboxing automat la Character.

Pentru a fi mai precis, conversia primitivă la obiect în momentul compilării se numește boxing. Unboxing este calea inversă.
Și da Character/char oferă o funcție de autoboxare, dar nu funcționează în acest mod. În acest caz, primitivele/învelișurile corespondente sunt într-o matrice sau într-o listă: deci nu există posibilitatea de boxare.

Asta compilează :

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

Dar asta nu funcționează:

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

Cum pot să fac să funcționeze acest lucru?

Sortarea unui array de char cu un anumit Comparator nu este convențională.
Așa că nu este surprinzător faptul că Arrays API nu oferă o astfel de metodă.
În general, Comparator și Comparable se bazează doar pe starea obiectelor comparate pentru a returna rezultatul, nu pe o variabilă externă, ca în exemplul dumneavoastră.
În mod similar, metoda Arrays API nu oferă nicio metodă pentru a crea un obiect Stream de pe char pentru că, de asemenea, streamingul de caractere nu este o nevoie foarte convențională.
Așadar, nu aveți o modalitate directă de rezolvare a problemei dumneavoastră.

În situația dumneavoastră, m-aș baza peArrays.stream(String.split()) pentru a obține un String pentru fiecare caracter al șirului original și aș aplica sortarea și aș termina cu o îmbinare :

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

Aceasta ar trebui să fie cea mai directă cale fără a utiliza biblioteci externe.

Krupal Shah
char[] tmpArr = T.toCharArray();

Aici este greșeala, nu puteți utiliza premitive cu comparator. trebuie să îl convertiți în Character[].

Ai putea face ceva de genul celor de mai jos cu Apache commons-lang:

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

Iată câteva modalități bune de conversie.

Hülya

public static void sort(T[] a,Comparator c)

Sortează matricea de obiecte specificată în conformitate cu ordinea indusă de comparatorul specificat.

Nu puteți utiliza primitive, Comparator funcționează numai cu obiecte.

char este un tip de date primitiv în java, deci trebuie să modificați tmpArr ca:

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

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

Joakim Danielson

Există deja o metodă de sortare pentru char[], deci

 Arrays.sort(tmpArr);

Așadar, fluxul complet este

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

Tags: