按匈牙利语字母顺序对匈牙利字符串列表进行排序

时间:2011-09-21 15:41:36

标签: java collation comparator

我现在正在与匈牙利人的一些数据工作。 我必须对匈牙利语字符串列表进行排序。

根据this Collation Sequence page

  

匈牙利字母顺序为:A =Á,B,C,CS,D,DZ,DZS,E =É,F,G,   GY,H,I =Í,J,K,L,LY,M,N,NY,O =Ó,Ö=Ő,P,Q,R,S,SZ,T,TY,   U =Ú,Ü=Ű,V,W,X,Y,Z,ZS

所以元音的处理方式相同(A =Á,...)所以在结果中你可以使用Collator得到一些类似的东西:

Abdffg
Ádsdfgsd
Aegfghhrf

到此为止,没问题:)

但是现在,我需要根据Hungarian alphabet

进行排序
  

AÁBC Cs D Dz DzsEÉFG Gy HIÍJK L Ly M N NyOÓÖŐP(Q)R S   Sz T TyUÜV(W)(X)(Y)Z Zs

A被认为与Á

不同

使用Collator中的Strength进行操作不会更改输出中的顺序。 A和Á仍然混在一起。

是否有根据匈牙利字母顺序对字符串列表进行排序的图书馆/技巧?

到目前为止,我所做的是:

  • Collator排序,以便正确排序C / C,D,DZ,DZS
  • 通过比较基于地图的每个单词的第一个字符再次排序

这对任务没什么麻烦?

List<String> words = Arrays.asList(
        "Árfolyam", "Az",
        "Állásajánlatok","Adminisztráció",
        "Zsfgsdgsdfg", "Qdfasfas"

);

final Map<String, Integer> map = new HashMap<String, Integer>();
      map.put("A",0);
      map.put("Á",1);
      map.put("E",2);
      map.put("É",3);

      map.put("O",4);
      map.put("Ó",5);
      map.put("Ö",6);
      map.put("Ő",7);

      map.put("U",8);
      map.put("Ú",9);
      map.put("Ü",10);
      map.put("Ű",11);


      final Collator c = Collator.getInstance(new Locale("hu"));
      c.setStrength(Collator.TERTIARY);
      Collections.sort(words, c);

      Collections.sort(words, new Comparator<String>(){
          public int compare(String s1, String s2) {

              int f = c.compare(s1,s2);
              if (f == 0) return 0;

              String a = Character.toString(s1.charAt(0));
              String b = Character.toString(s2.charAt(0));

              if (map.get(a) != null && map.get(b) != null) {
                  if (map.get(a) < map.get(b)) {
                      return -1;
                  }
                  else if (map.get(a) == map.get(b)) {
                      return 0;
                  }
                  else {
                      return 1;
                  }
              }


              return 0;
          }
      });

感谢您的输入

3 个答案:

答案 0 :(得分:9)

我发现了一个好主意,你可以使用RuleBasedCollat​​or。

来源:http://download.oracle.com/javase/tutorial/i18n/text/rule.html

以下是匈牙利的规则:

 < a,A < á,Á < b,B < c,C < cs,Cs,CS < d,D < dz,Dz,DZ < dzs,Dzs,DZS 
 < e,E < é,É < f,F < g,G < gy,Gy,GY < h,H < i,I < í,Í < j,J
 < k,K < l,L < ly,Ly,LY < m,M < n,N < ny,Ny,NY < o,O < ó,Ó 
 < ö,Ö < ő,Ő < p,P < q,Q < r,R < s,S < sz,Sz,SZ < t,T 
 < ty,Ty,TY < u,U < ú,Ú < ü,Ü < ű,Ű < v,V < w,W < x,X < y,Y < z,Z < zs,Zs,ZS

答案 1 :(得分:0)

更改地图的顺序。

将数字表示作为键,将字母作为值。这将允许您使用将按键排序的TreeMap。

然后您可以执行map.get(1)并返回字母表的第一个字母。

答案 2 :(得分:-1)

任何解决方案是否会导致将字符串(名称)'Czár'和'Csóka'排序为Czár,Csóka?这将是正确的顺序,因为Csóka中的CS被认为是一个字母并且在C之后。 然而,即使列出所有匈牙利语单词,也不可能识别双字符辅音,因为可能存在两个单词在字符上看起来完全相同的情况,但在一个中有两个辅音在一起,而在另一个两个字符在同一个地方代表一个字母。