在java中排序的2D字符串数组(使用本地土耳其字符)

时间:2012-12-15 19:32:37

标签: java sorting multidimensional-array arrays

我有一个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 

任何想法,教程或建议?

3 个答案:

答案 0 :(得分: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);
    }
}

FooTest

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

答案 1 :(得分:2)

应该改进比较器以进行空检查,等等。但这应该有效!

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

答案 2 :(得分: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的值:

  • Alex Smith
  • Gareth Baker
  • Zoe Doe

如果您需要更改它,那么您可以实现可比较并将其传递给TreeMap的构造函数:

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

您必须在上面的比较方法中输入您想要的逻辑。看起来您可能需要与标准字母顺序不同的实现。