Пользовательский вид строкового массива не алфавитный - PullRequest
1 голос
/ 08 августа 2011

У меня есть строковый массив, подобный этому:

string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };

Я хочу отсортировать этот массив, используя пользовательские критерии.Это не может быть в алфавитном порядке.Это может быть в следующем порядке: pgrj.

Я пытался реализовать новый IComparer, но внутри метода Compare() я не могу использовать строку. Сравните, потому что она сортируется по алфавиту иЯ не хочу этого делать.

Вопрос: как мне отсортировать массив имен в следующем порядке: pgrj?В случае 'j'.Дженис может быть раньше Джона.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

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

for (int i = 0; i < s1.Length; i++)
{
    int s1Value = sort.IndexOf(s1[i]);
    int s2Value = sort.IndexOf(s2[i]);

   if(s1Value > s2Value)
       return 1;

   if(s2Value > s1Value)
       return -1;
}

return 0;

Теперь несколько заявлений об отказе.

  1. Возможно, мои -1 и 1 перепутаны. Я давно не смотрел на ICompare и забыл, что есть что.
  2. Это не относится к двум строкам разной длины.
  3. Я не проверял этот код.

Вы можете улучшить это, создав собственный класс, чтобы назначить вес каждому персонажу.

class CustomAlphabetSort
{
     public char Character { get; set; }
     public int Weight { get; set; }
}

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

2 голосов
/ 09 августа 2011
void Main()
{
    string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };
    var reorderedNames = names.OrderByDescending(x => x, new MyComparer());
}

class MyComparer : IComparer<string>{

    int IComparer<string>.Compare(string s1, string s2){

        char l1 = s1[0];
        char l2 = s2[0];
        int ret;

        switch(l1){

            case 'g':   if(l2 == 'p'){
                            return -1;
                        }
                        else{
                            goto default;
                        }
            case 'r':   if(l2 == 'p' || l2 == 'g'){
                            return -1;
                        }
                        else{
                            goto default; 
                        }
            case 'j':   if(l2 == 'p' || l2 == 'g' || l2 == 'r'){
                            return -1;
                        }
                        else{
                            goto default;
                        }
            default:    ret = (l2 != l1) ?  1 : s1.CompareTo(s2); return ret;   
        }
        return ret;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...