C # разделить и обратное предложение с двумя языками - PullRequest
1 голос
/ 08 марта 2012

У меня есть такое предложение (на иврите, RTL):

ואמר был здесь אוראל

Теперь, когда я вставляю это в массив, я получаю:

  1. массив [0] = אוראל
  2. массив [1] = был
  3. массив [2] = здесь
  4. массив [3] =: ואמר

Теперь, поскольку иврит является языком RTL, мне нужно поменять местами английские буквы и поменять позиции. Обратите внимание, что мне нужно позаботиться о любом предложении (что означает, что я могу иметь более двух английских слов).

Как мне получить результат, похожий на следующий?

ואמר ereh saw אוראל

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


спасибо за вашу помощь, но у меня все еще есть проблема! я разделил предложение, как вы сказали, я перевернул массив и я получил это:

לארוא ereh saw רמאו

после шага 2 положения ивритских слов работают! на шаге 3 я снова перевернул слова на иврите и получил:

אוראל ereh saw ואמר

и мне нужно сменить их положение (один в один, как я уже сказал, я могу есть предложение с большим количеством слов ..) Итак, я не понял, как я «собрал строку массива вместе» (шаг 5)

Ответы [ 2 ]

5 голосов
/ 08 марта 2012

Ну, если бы вы разбили проблему на части, это выглядело бы так. Вам необходимо:

  1. Разделить предложение на массив строк
  2. обратный массив
  3. Определить, есть ли слово на иврите
  4. если он не на иврите, вам нужно поменять местами строку
  5. теперь вам просто нужно собрать массив строк вместе в одну строку, и все готово!

EDIT: Я неправильно понял вашу проблему. Вы могли бы сделать что-то вроде этого:

    public static string ProcessEnglishHebrewSentence(string sentence)
    {
        var ret = new List<string>();
        string[] words = sentence.Split(' ');

        var curHebrewList = new List<string>();
        var curEnglishList = new List<string>();
        bool curLangIsHebrew=false;

        foreach(var w in words)
        {
            if(IsHebrew(w) && curLangIsHebrew) // we have a word in Hebrew and the last word was in Hebrew too
            {
                curHebrewList.Add(w);
            }
            else if(IsHebrew(w) && !curLangIsHebrew) // we have a word in Hebrew and the last word was in English
            {
                if(curEnglishList.Any())            {
                    curEnglishList.Reverse();
                    ret.AddRange(curEnglishList);
                } // reverse current list of English words and add to List
                curEnglishList = new List<string>(); // create a new empty list for the next series of English words
                curHebrewList.Add(w);
                curLangIsHebrew=true; // set current language to Hebrew
            }
            else if(!IsHebrew(w) && !curLangIsHebrew) // we have a word in English and the last word was in English
            {
                curEnglishList.Add(new String(w.Reverse().ToArray())); // reverse and add it to the current series of English words
            }
            else if(!IsHebrew(w) && curLangIsHebrew) // we have a word in English and the last word was in Hebrew
            {
                if(curHebrewList.Any()) ret.AddRange(curHebrewList); // add current list of Hebrew words to List of Lists
                curHebrewList = new List<string>(); // create a new empty list for the next series of Hebrew words
                curEnglishList.Add(new string(w.Reverse().ToArray()));
                curLangIsHebrew=false; // set current language to English
            }
            else
            {
                throw new Exception("there should be no other case...");
            }
        }
        if(curHebrewList.Any()) ret.AddRange(curHebrewList);
        if(curEnglishList.Any())
        {
            curEnglishList.Reverse();
            ret.AddRange(curEnglishList);
        }

        return ret.Aggregate((a,b) => a + " " + b);
    }
0 голосов
/ 03 сентября 2012

Паоло проделал тяжелую работу по выяснению алгоритма:

  1. Разделить предложение на массив строк
  2. Обратный массив
  3. слово на иврите не в обратном порядке
  4. Присоединяйтесь к строкам

Вот более элегантная версия с использованием LINQ:

var result = Sentence
   .Split(' ')
   .Reverse()
   .Select(w => IsHebrew(w) ? w : new String(w.Reverse().ToArray())
   .Join(" ") 
...