在许多函数式语言(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)运行时间复杂度。
(我只在上面的代码中展示了这个想法,没有考虑所有细节)
感谢您的深思熟虑的回复!!
答案 0 :(得分:1)
不要将此视为答案,而应视为评论。问题是我无法在评论中发布代码。
如果我的问题是正确的话,一般的方法就是这个(很容易适应几乎所有语言):
蟒:
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)
答案 1 :(得分:1)
在python中你可以使用字典
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)