Сортировка списка венгерских строк в венгерском алфавитном порядке - PullRequest
11 голосов
/ 21 сентября 2011

Я сейчас работаю с некоторыми данными на венгерском языке.Я должен отсортировать список строк венгров.

Согласно этой странице последовательности сортировки

Венгерский алфавитный порядок: 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

Вплоть до здесь, нет проблем:)

Но теперь у меня естьтребование сортировки в соответствии с венгерским алфавитом

A B BC Cs D Dz Dzs E É FG Gy HI Í JKL Ly MN Ny O Ó Ö Ő P (Q) RSSz T Ty U Ú Ü Ű V (W) (X) (Y) Z Zs

A считается отличным от Á

Игра с Сила с Collator не меняет порядок вывода.А и А все еще перепутаны.

Существуют ли какие-либо библиотеки / приемы для сортировки списка строк в соответствии с венгерским алфавитным порядком?

Пока что я делаю:

  • Сортировка с 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 ]

9 голосов
/ 09 октября 2011

Я нашел хорошую идею, вы можете использовать RuleBasedCollator.

Источник: 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
0 голосов
/ 14 августа 2013

Приведет ли какое-либо из решений к заказу строк (имен) 'Czár' и 'Csóka' как Czár, Csóka? Это был бы правильный порядок, так как CS в Csóka считается одной буквой и идет после C. Однако распознать двухсимвольные согласные невозможно даже при наличии списка всех венгерских слов, поскольку могут быть случаи, когда два слова могут выглядеть одинаково по буквам, но в одном из них есть два согласных, а в другом два символа, представляющие одну букву в одном и том же месте.

0 голосов
/ 21 сентября 2011

Измените порядок вашей карты.

Поместите числовое представление в качестве ключа и букву в качестве значения. Это позволит вам использовать TreeMap, который будет отсортирован по ключу.

Затем вы можете просто выполнить map.get (1), и он вернет первую букву алфавита.

...