如何基于列表中的属性统一分发对象?

时间:2015-07-23 08:55:24

标签: java c# algorithm data-structures linked-list

让我们说,我有一个对象的集合或列表{A A B A B B C C D D E E F F F}

该列表随机填充。现在我希望它按如下方式重新排列列表

{A B C D E F A B C D E F A B C D F}

一种方法要为现有列表中的每个元素创建存储桶,然后遍历每个存储桶,顺序选择并添加预期列表中的元素,直到所有存储桶都持续存在。

3 个答案:

答案 0 :(得分:0)

您可以动态使用存储桶。举个例子:

快速版:

虽然存储桶和输入序列不为空:

  1. 在(A,B,C,D,A,.....)
  2. 中获取序列X中的下一个属性值
  3. 检查输入序列中的当前位置(如果属于属性X),然后将其置于新序列并增加位置,转到1
  4. 如果不是空桶X从桶X进入新序列并移至1
  5. 将项目从当前位置放入适当的桶中,增加位置,转到2
  6. 减少内存使用量版本

    1. 在(A,B,C,D,A,.....)
    2. 中获取序列X中的下一个属性值
    3. 如果不是空桶X从桶X进入新序列并移至1
    4. 检查输入序列中的当前位置(如果属于属性X),然后将其置于新序列并增加位置,转到1
    5. 将项目从当前位置放入适当的桶中,增加位置,转到3

答案 1 :(得分:0)

假设输入只是A-Z字母。因此,在这种情况下,您将只有26个可能的角色。因此,只要输入存储在哈希表中,就可以使用哈希表来存储输入字符的计数。 现在只需使用此函数即可获得输出。

while(哈希中有任何项目) {

for(i 1 to 26) {

打印每个非零计数字符和减量计数

}

}

答案 2 :(得分:0)

将对象放入一个hashmap,其值为key,并显示出现次数的计数器(也保留插入顺序)。然后创建输出列表,迭代映射中的键并附加每个键值,同时减少其计数。重复,直到地图用完为止。这是python中的代码:

from collections import OrderedDict

def arrange(l):

  d=OrderedDict()
  for x in l:
    d[x]=d.setdefault(x, 0)+1

  r=[]
  while len(d)>0:
    for x in d:
      r.append(x)
      d[x]-=1
      if d[x]==0:
        del d[x]

  return r