Во множестве функциональных языков (python, ruby,...) или SQL мы можем напрямую использовать функцию Group_by (метод). Мой вопрос: если я хочу реализовать эту функцию (например, используя Java, C,.., которые не имеют "group_by", реализованных по умолчанию), что было бы лучшим способом сделать это? Следующая идея - общая идея подхода, любая идея лучше, чем эта?
Input: [ Key, Value ]
{ [ 'A', 1 ], [ 'B', 3 ], [ 'C', 1 ], [ 'A', 2 ], [ 'A', 6 ], [ 'B', 7 ] ... ... ... }
Output:
{ [ 'A', [ 1, 2, 6 ] ], [ 'B', [ 3, 7 ] ], [ 'C' [ 1 ] ], ... ... }
for element in "input":
for temp in "input":
if ( temp.key == element.key )
Output . getKey( element.key ) . addValue( temp.value );
end if
end for
end for
кроме того, пусть предполагается, что массив не отсортирован, и пусть предположим, что мы не сортируем его сначала (сначала сортировать его было бы очень просто).
Спасибо за это. Мы всегда можем сортировать его в первую очередь. Это один из способов сделать это. Кроме того, иногда это требует НЕ модифицировать ввод, что бы вы сделали? (копировать все входные данные было бы одним из решений, которое стоило бы много памяти)
Спасибо за то, что хэш-таблица также может решить эту проблему. Я считаю, что это самый распространенный способ сделать это. O (n) и сложность времени выполнения O (n).
(Я только демонстрирую идею в приведенном выше коде, не рассматриваю все детали)
Спасибо за ваш вдумчивый ответ!
В python вы можете использовать dictioanry
input = [('A', 1), ('B', 3), ('C', 1), ('A', 2), ('A', 6), ('B', 7)]
output = {}
for key, value in input:
if not key in output:
output[key] = []
output[key].append(value)
Не рассматривайте это как ответ, а как комментарий. Дело в том, что я не могу отправлять комментарии в комментариях.
Общим подходом было бы это (легко адаптируемое практически к любому языку), если я правильно понял ваш вопрос:
питон:
def group_by(arr):
arr.sort()
newarr=[]
temparr=[]
k=""
for i in arr:
if i[0]!=k:
if len(temparr)>0:
newarr.append([k,temparr]) # newarr = newarr + [k, temparr] also works
k=i[0]
temparr=[i[1]]
else:
temparr.append(i[1])
newarr.append([k,temparr])
print(newarr)
defaultdict(list)
- возможно, именно так я и реализовал бы это на других языках. - Какие-то значения отображения хеш-таблиц в какую-то структуру списка, которая поддерживает добавление.