微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

匈牙利字典排序

如何解决匈牙利字典排序

我正在尝试按字母顺序对字典中的匈牙利语单词进行排序。所有字母的预期顺序应该是 aábcdeéfggyhiíjklmnoóöőpqrsttyuúüüűvwxyz

我试图使用 Intl.Collat​​or() 和 localeCompare 但预期的输出从来都不正确。

例如:

console.log(["baj",'betűz','ä',"bácsi"].sort(new Intl.Collator('hu').compare));
//expected output ["ä","baj","bácsi","betűz"]

我得到的是数组 ["ä","betűz"]

á 在 a 之前,但应该在 a 之后

这也发生在 é 和 í 身上。

我正在尝试使用

.sort(function(a,b) {
  let lettera = a.toupperCase();
  let letterB = b.toupperCase();
  if (lettera < letterB) {
    return -1;
  }
  if (lettera > letterB) {
    return 1;
  }
  return 0;
});

但是带有特殊符号的单词放在数组的末尾,这不是我想要的。

有关如何解决该问题的任何建议?

解决方法

您可以手动排序并使用给定的字母表获得所需的顺序。

const
    alphabet = 'aábcdeéfggyhiíjklmnoóöőpqrsttyuúüűvwxyz',order = Object.fromEntries([].map((c,i) => [c,i + 1])),compare = (a,b) => {
        let i = 0,l = Math.min(a.length,b.length),r = 0;
            
        while (!r && i < l) {
            r = a[i] in order && b[i] in order ? order[a[i]] - order[b[i]] : a[i].localeCompare(b[i]);
            i++;
        }
        return r || a.length - b.length;
    }

console.log(...["baj",'betűz','ä',"bácsi"].sort(compare)); // ["ä","baj","bácsi","betűz"]

,

一段时间后,在我兄弟的大力帮助下,我们想出了一个解决方案,它基本上可以是任何字母

const wordList = [
  { id: 1,word_hu: 'búcsúajándék' },{ id: 2,word_hu: 'Bőrönd' },{ id: 3,word_hu: 'betűz' },{ id: 4,word_hu: 'bácsi' },{ id: 5,word_hu: 'bejelöl' },{ id: 10,word_hu: 'áfjklsdfjk' },{ id: 18,word_hu: 'aáfjklsdffvk' },{ id: 11,word_hu: 'azjklsdfjk' },{ id: 21,word_hu: 'ahjklsdfjk' },{ id: 6,word_hu: 'büfé' },{ id: 7,{ id: 8,word_hu: 'ceruza' },{ id: 9,word_hu: 'baj' },];

 const alphabetIndex = {
  a: 1,á: 2,b: 3,c: 4,d: 5,e: 6,é: 7,f: 8,g: 9,h: 10,i: 11,í: 12,j: 13,k: 14,l: 15,m: 16,n: 17,o: 18,ó: 19,ö: 20,ő: 21,p: 22,q: 23,r: 24,s: 25,t: 26,u: 27,ú: 28,ü: 29,ű: 30,v: 31,w: 32,x: 33,y: 34,z: 35,};

const getWordsPair = (aWord,bWord) => {
  const aWordArray = aWord.toLowerCase().replace(" ","").split('');
  const bWordArray = bWord.toLowerCase().replace(" ","").split('');

  let shouldReturn = false;

  return aWordArray.reduce(
    (acc,aWordletter,aWordIndex) => {
      if (shouldReturn) {
        return acc;
      }

      const bWordLetter = bWordArray[aWordIndex];
      const aWordLetterNumber = alphabetIndex[aWordletter];
      const bWordLetterNumber = alphabetIndex[bWordLetter];

      acc[0].push(aWordLetterNumber);
      acc[1].push(bWordLetterNumber);

      shouldReturn = aWordLetterNumber !== bWordLetterNumber;

      return acc;
    },[[],[]]
  );
}

const sortWords = (list) => {
  return list.sort((aWordObject,bWordObject) => {
    const aWord = aWordObject.word_hu;
    const bWord = bWordObject.word_hu;

    const wordsPair = getWordsPair(aWord,bWord);

    const mappedAWord = wordsPair[0].join('');
    const mappedBWord = wordsPair[1].join('');

    return mappedAWord - mappedBWord;
  });
};

const sortedList = sortWords(wordList);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。