0

私は次のような文字列の2D配列を持っています:

gsdfsdf | awfdsf 
asdasd  | sjd    
çsadsfd | kdjfkj 
bsdmfbs | skfjef 
ıfjdhsb | döjfn  
zewkjf  | skjfkj 
iadsa   | dfjdkj 

ローカル(トルコ語)の文字が含まれていることがわかるように、最初の列に従って並べ替えたいのですが、並べ替え後は次のようになります。

asdasd  | sjd    
bsdmfbs | skfjef 
çsadsfd | kdjfkj 
gsdfsdf | awfdsf 
ıfjdhsb | döjfn  
iadsa   | dfjdkj 
zewkjf  | skjfkj 

アイデア、チュートリアル、アドバイスはありますか?

4

3 に答える 3

2

nullチェックなどのためにコンパレータを改善する必要がありますが、これはうまくいくはずです!

final String alphabet = "0123456789AaBbCcÇçDdEeFfGgĞğHhIıİiJjKkLlMmNnOoÖöPpQqRrSsŞşTtUuÜüVvWwXxYyZz";
SortedMap<String,String> map = new TreeMap(new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            int n = Math.min(o1.length(), o2.length());
            int i=0;
            while((i < n) && (o1.charAt(i) == o2.charAt(i))){
                i++;
            }
            if(i==n){
                return 0;
            }
            if(alphabet.indexOf(o1.charAt(i)) < alphabet.indexOf(o2.charAt(i))){
                return -1;
            }
            return 1;
        }
    });
于 2012-12-15T20:24:42.750 に答える
2

完全な解決策ではありませんが、ヒントです。

Java は、Collatorロケールに依存する文字列比較のためのクラスを提供します。

サンプル (グアバ入り):

フー

package com.stackoverflow.so13895464;

import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

import java.text.Collator;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

public class Foo {
    public static String sortAndOutput(final String in)
    {
        final List<String> split = Lists.newArrayList(Splitter.on('\n').split(in));
        Collections.sort(split, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2)
            {
               final Collator collator = Collator.getInstance(Locale.forLanguageTag("tr_TR"));
               // XXX: toUpperCase to avoid a dotless i problem (was at the end)
               return collator.compare(o1.toUpperCase(), o2.toUpperCase()); 
            }
        });
        return Joiner.on('\n').join(split);
    }
}

フットテスト

package com.stackoverflow.so13895464;

import org.junit.Test;

import static org.junit.Assert.*;

public class FooTest {
    @Test
    public void testSort()
    {
        final String in = "gsdfsdf | awfdsf\nasdasdsjd\nçsadsfd | kdjfkj\nbsdmfbs | skfjef\n" +  
            "ıfjdhsb | döjfn\nzewkjf  | skjfkj\niadsa   | dfjdkj";
        final String exp = "asdasd  | sjd\nbsdmfbs | skfjef\nçsadsfd | kdjfkj\ngsdfsdf | awfdsf\n" +
            "ıfjdhsb | döjfn\niadsa   | dfjdkj\nzewkjf  | skjfkj";
        assertEquals(exp, Foo.sortAndOutput(in));
    }
}
于 2012-12-15T20:04:55.323 に答える
1

文字列の2D配列を使用するのではなく、TreeMapを使用します。これにより、TreeMapのキーで並べ替えることができます。デフォルトでは、これは自然に順序付けられているため、必要なものがアルファベット順に基づいていますが、トルコ語の文字がアルファベット順にどこにあるかはわかりません。

TreeMap tm = new TreeMap(); 
// Put elements to the map 
tm.put("Zoe Doe", "First entry"); 
tm.put("Alex Smith", "Second entry"); 
tm.put("Gareth Baker", "Third entry");
// Get a set of the entries 
Set set = tm.entrySet(); 
// Get an iterator 
Iterator i = set.iterator(); 
// Display elements 
while(i.hasNext()) { 
Map.Entry me = (Map.Entry)i.next(); 
System.out.print(me.getKey() + ": "); 
System.out.println(me.getValue()); 
} 

これにより、TreeMapの値がアルファベット順に出力されます。

  • アレックススミス
  • ガレス・ベイカー
  • ゾーイ・ドウ

これを変更する必要がある場合は、同等のものを実装して、TreeMapのコンストラクターに渡すことができます。

TreeMap tm = new TreeMap(new Comparator<Foo>()
             {
                 public int compare(Foo f1, Foo f2)
                 {
                     return f1.toString().compareTo(f2.toString());
                 }        
             });

上記のcompareメソッドに必要なロジックを配置する必要があります。どうやら、標準のアルファベット順とは異なる実装が必要になる場合があります。

于 2012-12-15T19:45:26.043 に答える