1

リストを並べ替えるこの python コードをitemsJava コードに変換しようとしています。Javaでこの種のソートを行うにはどうすればよいですか?

python code:

import re
items = ['10H', '10S', '2H', '3S', '4S', '6C', '7D', '8C', '8D', '8H', '11D', '11H', '12H']
sortedItems = sorted(items, key=lambda x:int(re.findall(r'(\d+)[A-Z]*$',x)[0]))

#print sortedItems will result to the following sorted data which is what i wanted
#['2H', '3S', '4S', '6C', '7D', '8C', '8D', '8H', '10H', '10S', '11D', '11H', '12H']

これまでのところ、私が持っているものjavaは次のとおりです。

//code something like this
ArrayList<String> items = new ArrayList<String>(Arrays.asList("10H", "10S", "2H", "3S", "4S", "6C", "`7D", "8C", "8D", "8H", "11D", "11H", "12H"));
Collections.sort(items)

ありがとう

4

2 に答える 2

4

ComparatorPython スクリプトで宣言されたラムダ式の代わりにカスタムを使用する必要があります。

Collections.sort(items,  new Comparator<String>() {
    private Pattern p = Pattern.compile("(\d+)[A-Z]*)");
    public int compare(String o1, String o2) {
        Matcher m1 = p.matcher(o1);
        Matcher m2 = p.matcher(o2);

        return Integer.valueOf(m1.group(0)).compareTo(Integer.valueOf(m2.group(0)));
    }
});

Comparatorラムダ式も比較しないため、これは文字コンポーネントを比較しないことに注意してください。

于 2012-09-21T13:43:29.930 に答える
2

Collections.sortはコンパレータも受け入れます。

だから、あなたはこれを行うことができます-

Collections.sort(items, new Comparator<String>() {
    @Override
    public int compareTo(String s1, String s2) {
           // do your magic here , by extracting the integer portion, comparing those
           // and then comparing the string to return 1 , 0 , -1
    }
});
于 2012-09-21T13:45:26.293 に答える