Сортировка arraylist в c # относительно его подэлементов - PullRequest
2 голосов
/ 08 июня 2019

У меня есть ArrayList, элементами которого являются Array. Я хочу отсортировать ArrayList, используя элементы Array. Для пояснения, давайте предположим, что у нас есть следующий массив:

arraylist{[10,2], [6,3], [12,2]}

Затем я хочу отсортировать его в порядке убывания, используя деление каждого элемента массивов друг на друга (массив a_i = [a_i,b_i] ==> sort using max(a_i/b_i)), то есть в следующем виде:

arraylist{[12,2],[10,2],[6,3]}

Я пытался использовать Sort(), но это для списка, а не для ArrayList, как я знаю. Кто-нибудь, пожалуйста, дайте мне знать, как я могу эффективно отсортировать его, чтобы избежать высокой сложности?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 июня 2019

Как кто-то сказал в комментариях, вам лучше использовать List<T>.Но вот как это сделать, используя Sort () с IComparer ()

class DivisionComparer : IComparer<int[]>, IComparer
{

    public int Compare(int[] x, int[] y)
    {
        double xval = (double) x[0] / x[1];
        double yval = (double) y[0] / y[1];
        return yval.CompareTo(xval);
    }

    public int Compare(object x, object y)
    {
        return Compare((int[]) x, (int[]) y);
    }
}


class Program
{

    static void Main(string[] args)
    {

        var x = new ArrayList()
        {
            new [] {6,3},                
            new [] {12,2},
            new [] {10,2},

        };
        x.Sort(new DivisionComparer());
        foreach (var el in x)
        {
            Debug.WriteLine(string.Join(",", (int[]) el));
        }
    }
}

Это выдаст:

12,2
10,2
6,3
3 голосов
/ 08 июня 2019

ArrayList устарело, и вам больше не следует его использовать ..:

MSDN : мы не рекомендуем использовать класс ArrayList для новой разработки,Вместо этого мы рекомендуем использовать общий класс List.

Предположим, вы создали List<Tuple<int, int>>, например, вот так:

var tupleList = new List<Tuple<int, int>>
{
    new Tuple<int, int>(10,2 ),
    new Tuple<int, int>(6,3),
    new Tuple<int, int>(12,2)
};

Затем результат можно создать с помощьюLinq, может быть, вот так:

var sorted = tupleList.OrderByDescending(x => x.Item1 / x.Item2);

Это исключает любые проверки деления на ноль ..

Чтобы сделать инициализацию немного короче, вы можете использовать функцию ..

Func<int, int, Tuple<int, int>> tc = Tuple.Create;

.. взято из здесь и напишите:

var tupleList = new List<Tuple<int, int>>
{
    tc(10,2 ),
    tc(6,3 ),
    tc(12,2 )
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...