【问题标题】:Collator Locale German - How to sort accented letters only after the normal onesCollat​​or Locale German - 如何仅在正常字母之后对重音字母进行排序
【发布时间】:2017-05-12 06:54:22
【问题描述】:

我使用 Collat​​or 对对象数组进行排序。但我发现它像对待普通字母一样处理重音字母:

Aktivierung
Änderung
Auszahlung
Bar

我想要这个

Aktivierung
Auszahlung
Änderung
Bar

重音字母应该放在正常字母之后。这也适用于 o/ö 和 u/ü。

Collator collator = Collator.getInstance(Locale.GERMAN);
...
private void sortDocumentiByCategoria(final Collator collator, List<ListDocumenti> listDocumenti) {
      Collections.sort(listDocumenti, new Comparator<ListDocumenti>(){
          @Override
          public int compare(ListDocumenti arg0, ListDocumenti arg1) {
              return collator.compare(arg0.getDescrizione(), arg1.getDescrizione());
          }
      });
}

【问题讨论】:

  • 你应该展示你的代码。
  • 你说的是比较器吗?

标签: java list sorting collator


【解决方案1】:

花了一些时间,但我想通了。给你!

public static void main(String[] args) throws IOException {
    List<String> list = Arrays.asList("Änderung", "Aktivierung", "Auszahlung", "Bar");

    Collections.sort(list, createCollator());

    System.out.println(list);
}

private static RuleBasedCollator createCollator() {
    String german = "" +
                    "= '-',''' " +
                    "< A< a< ä< Ä< B,b< C,c< D,d< E,e< F,f< G,g< H,h< I,i< J,j" +
                    "< K,k< L,l< M,m< N,n< O< o< Ö< ö< P,p< Q,q< R,r< S,s< T,t" +
                    "< U< u< Ü< ü< V,v< W,w< X,x< Y,y< Z,z" +
                    "& ss=ß";

    try {
        return new RuleBasedCollator(german);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}

测试它会产生以下结果:

>> [Aktivierung, Auszahlung, Änderung, Bar]

【讨论】:

    【解决方案2】:

    你的排序比你需要的更复杂......

    Collections.sort 会将元音变音结束

     List<String> l = Arrays.asList("Aktivierung", "Änderung", "Auszahlung", "Bar");
     System.out.println(l);
     Collections.sort(l);
     System.out.println(l);
    

    [Aktivierung, Änderung, Auszahlung, 酒吧]

    [Aktivierung, Auszahlung, Bar, Änderung]

    '编辑:

    根据您自己定义的德语规则实现整理器...

     List<String> l = Arrays.asList("Aktivierung", "Änderung", "Auszahlung", "Bar");
     String germanRules = "< A < a < Ä < ä < O < o < Ö < ö < U < u < Ü < ü";
    
     RuleBasedCollator ruleBasedCollator = new RuleBasedCollator(germanRules);
     Collections.sort(l, ruleBasedCollator);
     System.out.println(l);
    

    输出将是:

    Aktivierung、Auszahlung、Änderung、酒吧

    【讨论】:

    • OP 想要Aktivierung, Auszahlung, Änderung, Bar
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多