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

2022-09-04 21:45:07

我目前正在处理匈牙利人的一些数据。我必须对匈牙利语字符串列表进行排序。

根据此归类序列页面

匈牙利语的字母顺序为:A=Á, B, C, CS, D, 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, ZS

因此,元音被处理成相同的(A = Á,...),因此在结果中,您可以使用Collator获得一些类似的元音:

Abdffg
Ádsdfgsd
Aegfghhrf

到这里,没有问题:)

但现在,我需要根据匈牙利字母排序

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 被认为与 Á 不同

使用力量从不会改变输出中的顺序。A 和 Á 仍然混为一谈。Collator

是否有任何语言/技巧可以根据匈牙利语字母顺序对字符串列表进行排序?

到目前为止,我正在做的是:

  • 排序方式为 C/C、D、DZ、DZS...已正确排序Collator
  • 通过根据地图比较每个单词的第一个字符来再次排序

这看起来太麻烦了,任务没有?

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

感谢您的输入


答案 1

我发现了一个好主意,你可以使用一个基于规则的整理器。

资料来源: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

答案 2

按流,您可以按如下方式排序:

public List<String> sortBy(List<String> sortable) {

  Collator coll = Collator.getInstance(new Locale("hu","HU"));

  return sortable.stream()
                 .sorted(Comparator.comparing(s -> s, coll))
                 .collect(Collectors.toList());
}

推荐