Сортировать ArrayList хеш-таблиц по ключам в каждой хеш-таблице - PullRequest
1 голос
/ 06 марта 2012

Допустим, у меня есть ArrayList с коллекцией хеш-таблиц в виде элементов - что-то вроде этого:

Hashtable ht1 = new Hashtable();
ht1.add('position', 1);
ht1.add('trending', 2);

Hashtable ht2 = new Hashtable();
ht2.add('position', 2);
ht2.add('trending', 1);

...more of these with varying position & trending values

ArrayList arr = new ArrayList();
arr.add(h1);
arr.add(h2);
...

изначально массив сортируется по "позиции", и я распечатываю информацию с помощью простого цикла

for(int x=0; x < arr.length; x++)
{
    Hashtable h = (Hashtable)arr[x];
    print(h["position"]);
}

Далее, я хочу переупорядочить массив с помощью «трендов» и повторить цикл.

Возможно ли отсортировать массив на основе ключей в каждом элементе хеш-таблицы?

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Если вы застряли с 1.1, вам нужно что-то вроде этого;

class MyComparer : IComparer
{
    string key;
    public MyComparer(string key)
    {
        this.key = key;
    }
    public int Compare(object x, object y)
    {
        return ((int)((Hashtable)x)[key]).CompareTo((int)((Hashtable)y)[key]);
    }
}

тогда можно звонить arr.Sort(new MyComparer("trending"));

Когда кто-то публикует решение, используя дженерики, вы увидите, насколько оно чище.

2 голосов
/ 06 марта 2012
public class AClass
{
    public int Position { set; get; }
    public int Trending { set; get; }
}

List<AClass> list = new List<AClass>() ;

list.Add(new AClass() { Position = 1, Trending = 2 });
list.Add(new AClass() { Position = 2, Trending = 1 });

var order1 = list.OrderBy(x => x.Position).ToArray();
foreach (var item in order1)
{
    Console.WriteLine(item.Position);
}

var order2 = list.OrderBy(x => x.Trending).ToArray();
foreach (var item in order2)
{
    Console.WriteLine(item.Position);
}
0 голосов
/ 06 марта 2012

если вы желаете изменить его

создать класс значений, которые вы храните в хеш-таблице

public class Item{
   public int Position { get; set; }
   public int Trending { get; set; }
}

создать несколько экземпляров этих классов в общем списке вместо ArrayList

List<Item> items = new List<Item>();
items.Add(new Item{ Position = 1, Trending = 2 });
items.Add(new Item{ Position = 2, Trending = 1 });

затем вы используете лямбду для сортировки списка

List<Item> listOrderByPosition = items.OrderBy(i => i.Position).ToList();
List<Item> listOrderByTrending = items.OrderBy(i => i.Trending).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...