我有一个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
任何想法,教程或建议?
答案 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);
}
}
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的值:
如果您需要更改它,那么您可以实现可比较并将其传递给TreeMap的构造函数:
TreeMap tm = new TreeMap(new Comparator<Foo>()
{
public int compare(Foo f1, Foo f2)
{
return f1.toString().compareTo(f2.toString());
}
});
您必须在上面的比较方法中输入您想要的逻辑。看起来您可能需要与标准字母顺序不同的实现。