【问题标题】:Sorting String with non-western characters使用非西方字符对字符串进行排序
【发布时间】:2013-03-09 05:59:28
【问题描述】:

我想打印所有可用语言的排序波兰语名称。

import java.util.*;

public class Tmp
{
  public static void main(String... args)
  {
    Locale.setDefault(new Locale("pl","PL"));
    Locale[] locales = Locale.getAvailableLocales();
    ArrayList<String> langs = new ArrayList<String>();
    for(Locale loc: locales) {
      String  lng = loc.getDisplayLanguage();
      if(!lng.trim().equals("") && ! langs.contains(lng)){
        langs.add(lng);
      }
    }
    Collections.sort(langs);
    for(String str: langs){
      System.out.println(str);
    }
  }
}

不幸的是,我对排序部分有疑问。 输出是:

:
:
kataloński
koreański
litewski
macedoński
:
:
węgierski
włoski
łotewski

不幸的是,波兰语中的łl 之后和m 之前,所以输出应该是:

:
:
kataloński
koreański
litewski
łotewski
macedoński
:
:
węgierski
włoski

我怎样才能做到这一点?是否有一种通用的非语言依赖方法(比如我现在想显示这个并使用另一种排序规则以另一种语言进行排序)。

【问题讨论】:

标签: java string sorting locale


【解决方案1】:

试试

Collections.sort(langs, Collator.getInstance(new Locale("pl", "PL")));

它会产生

...
litewski
łotewski
...

有关详细信息,请参阅 Collat​​or API

【讨论】:

    【解决方案2】:

    您应该将 Collat​​or 传递给 sort 方法:

    // sort according to default locale
    Collections.sort(langs, Collator.getInstance());
    

    默认排序顺序由字符串中的 Unicode 代码点定义,这不是任何语言中正确的字母顺序。

    【讨论】:

      【解决方案3】:

      看看java.text.Collator.newInstance(Locale)。您需要在您的情况下提供波兰语语言环境。收集器实现了Comparator 接口,因此您可以在排序API 和排序数据结构(如TreeSet)中使用它。

      【讨论】:

        【解决方案4】:

        不幸的是,波兰语中的 ł 出现在 l 之后 m 之前,所以输出 应该是:

        您可以定义自己的CompararableComparator 接口。

        或者这也可能对您有所帮助:

        【讨论】:

          【解决方案5】:

          我正在处理同样的问题。我发现本地收集器解决方案适用于 android 7.0,但不适用于早期的 android 版本。 我已经实现了以下算法。它非常快(我对 3000 多个字符串进行排序)并且在早期的 android 版本上也是如此。

          public class SortBasedOnName implements Comparator {
          
              private Map<Character, Integer> myCharMap;
              private final static Map<Character, Integer>myPolCharTable = new HashMap<Character, Integer>();
              static {
                  myPolCharTable.put(' ',0x0020);
                  myPolCharTable.put('!',0x0021);
                  myPolCharTable.put('"',0x0022);
          
          
                  myPolCharTable.put('a',0x0040);
                  myPolCharTable.put('ą',0x0041);
                  myPolCharTable.put('b',0x0042);
                  myPolCharTable.put('c',0x0043);
                  myPolCharTable.put('ć',0x0044);
          
          
                  myPolCharTable.put('{',0x0066);
                  myPolCharTable.put('|',0x0067);
                  myPolCharTable.put('}',0x0068);
              }
          
              public SortBasedOnName() {}
          
              public int compare(Object o1, Object o2) {
          
                  Dictionary dd1 = (Dictionary) o1;
                  Dictionary dd2 = (Dictionary) o2;
          
              return strCompareWithDiacritics(dd1.getOriginal(), dd2.getOriginal());
              }
          
              private  int strCompareWithDiacritics(String s1, String s2) {
          
                  int i = 0;
                  int result = 0;
                  int length =0;
          
                  s1 = s1.toLowerCase();
                  s2 = s2.toLowerCase();
                  if (s1.length() > s2.length()) {
                      result = 1;
                      length = s2.length();
                  } else if (s1.length() < s2.length()) {
                      result = -1;
                      length = s1.length();
                  } else if (s1.length() == s2.length()) {
                      result = 0;
                      length = s1.length();
                  }
          
                  try {
                      while (i <length) {
                          if (myPolCharTable.get(s1.charAt(i)) > myPolCharTable.get(s2.charAt(i))) {
                              result = 1;
                              break;
                          } else if (myPolCharTable.get(s1.charAt(i)) < myPolCharTable.get(s2.charAt(i))) {
                              result = -1;
                              break;
                          }
                          i++;
                      }
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return result;
              }
          }
          

          【讨论】:

            【解决方案6】:

            类似的东西

            val polishCollator = yourCollection.sortedWith(Comparator { s1, s2 ->
                        Collator.getInstance(Locale("pl", "PL")).compare(s1,s2)
                    })
            

            【讨论】:

              猜你喜欢
              • 2021-03-17
              • 2016-08-28
              • 2011-04-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-24
              • 2012-11-14
              • 2017-06-21
              相关资源
              最近更新 更多