Сортировка списка венгерских строк в венгерском алфавитном порядке

В настоящее время я работаю с некоторыми данными на венгерском языке. У меня есть отсортировать список венгерских строк.

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

венгерский алфавитный порядок следующий: 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 Á BC Cs D Dz Dzs E É FG Gy HI Í JKL Ly MN Ny O Ó Ö Ő P (Q) RS Sz T Ty U Ú Ü Ű V (W) (X) ( Y) Z Zs

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

Игра с Strength из Collator не меняет порядок на выходе. A и Á все еще перепутались.

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

На данный момент я делаю следующее:

  • Сортировка с помощью Collator , чтобы C / Cs, D, DZ, DZS ... отсортированы правильно
  • Сортировка снова, сравнивая первые символы каждого слова на основе карты

Выглядит слишком хлопотно для задачи нет?

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

);

final Map map = new HashMap();
      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(){
          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;
          }
      });

Спасибо за ваш вклад

11
задан ccheneson 21 September 2011 в 19:43
поделиться