2

質問が重複している場合は、そのリンクを提案してください。

私のコードは

 public static void main(String[] args) {
      String name ="h498y948759hrh98A722hjDF94yugerTEr892ur48y";
      char[] arr= name.toCharArray();
      Arrays.sort(arr);
      System.out.println(arr);
}

結果は

 222444457788888999999ADEFTeghhhhjrrrruuyyy

今、この並べ替えの順序を ADEFT222444457788888999999eghhhhjrrrruuyyy または eghhhhjrrrruuyyy222444457788888999999ADEFT のように変更したい

質問は、どうすればこのシーケンスを変更できますか? これが間違った並べ替え方法である場合は、正しい方法を教えてください。

ありがとう

4

2 に答える 2

4

独自のComparatorクラス/オブジェクトを作成して に渡すことができますArrays.sort()。残念ながら、要素を に変換する必要もありますCharacter

ただし、おそらく最も一般的な方法は、次の例のように、各文字を として見て、Stringを使用することです。Collator

    //  Rules separated in 3 parts only for convenience
    String rules1= "< A < B < C < D < E < F < G < H < I < J < K < L < M < N < O < P < Q < R < S < T < U < V < W < X < Y < Z" ;
    String rules2= "< a < b < c < d < e < f < g < h < i < j < k < l < m < n < o < p < q < r < s < t < u < v < w < x < y < z" ;
    String rules3= "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9" ;
    RuleBasedCollator collator= new RuleBasedCollator(rules1+rules2+rules3) ;

    String input= "h498y948759hrh98A722hjDF94yugerTEr892ur48y" ;

    //  Bulk of the job done here
    String[] arr= input.split("") ;
    Arrays.sort(arr,1,arr.length,collator);

    //  Join back in a single string for presentation
    StringBuilder sb= new StringBuilder() ;
    for(String e: arr )
        sb.append( e );
    System.out.println(sb);

出力は

    ADEFTeghhhhjrrrruuyyy222444457788888999999

照合規則のみを

    String rules1= "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9" ;
    String rules2= "< A,a < B,b < C,c < D,d < E,e < F,f < G,g < H,h < I,i < J,j < K,k < L,l < M,m < N,n < O,o < P,p < Q,q < R,r < S,s < T,t < U,u < V,v < W,w < X,x < Y,y < Z,z" ;
    RuleBasedCollator collator= new RuleBasedCollator(rules1+rules2) ;

出力は

    222444457788888999999ADEeFghhhhjrrrrTuuyyy

sの主な利点は、Collator複数文字の文字列を内部規則に従ってソートできることです。実際、これが彼らの主な使用例です。

かなり強力ですね。(はい、ご想像のとおり、私はカナダ人です :-) )

于 2013-08-25T14:18:49.333 に答える
3

Comparator概念を示すためにいくつかのサンプルを書きました。Guavaが必要です:

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.google.common.collect.ComparisonChain;
import com.google.common.primitives.Chars;

public class Test {
    private enum Comparators implements Comparator<Character> {
        UPPER_DIGIT_LOWER {
            @Override
            int compare(char lhs, char rhs) {
                return ComparisonChain.start()
                        .compareTrueFirst(Character.isUpperCase(lhs), Character.isUpperCase(rhs))
                        .compareTrueFirst(Character.isDigit(lhs), Character.isDigit(rhs))
                        .compareTrueFirst(Character.isLowerCase(lhs), Character.isLowerCase(rhs))
                        .compare(lhs, rhs)
                        .result();
            }
        },
        LOWER_DIGIT_UPPER {
            @Override
            int compare(char lhs, char rhs) {
                return ComparisonChain.start()
                        .compareTrueFirst(Character.isLowerCase(lhs), Character.isLowerCase(rhs))
                        .compareTrueFirst(Character.isDigit(lhs), Character.isDigit(rhs))
                        .compareTrueFirst(Character.isUpperCase(lhs), Character.isUpperCase(rhs))
                        .compare(lhs, rhs)
                        .result();
            }
        };

        @Override
        public int compare(Character lhs, Character rhs) {
            return compare(lhs.charValue(), rhs.charValue());
        }

        abstract int compare(char lhs, char rhs);
    }

    private static String sortChars(String str, Comparator<Character> cmp) {
        List<Character> chars = Chars.asList(str.toCharArray());
        Collections.sort(chars, cmp);
        return new String(Chars.toArray(chars));
    }

    public static void main(String[] args) {
        String name = "h498y948759hrh98A722hjDF94yugerTEr892ur48y";
        System.out.println(sortChars(name, Comparators.UPPER_DIGIT_LOWER));
        System.out.println(sortChars(name, Comparators.LOWER_DIGIT_UPPER));
    }
}
于 2013-08-25T14:30:48.803 に答える