如何根据列表中的属性统一分发对象



假设我有一个对象集合或列表{a a B a B B C C C D D E E D F F F}

随机填充列表。现在我想让它重新排列列表,如下所示

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

的一种方法是为现有列表中的每个元素创建桶,然后依次遍历每个桶,选择并添加预期列表中的元素,直到所有桶最后。

可以动态地使用bucket。例如:

快速版:

当桶和输入序列不为空时:

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

内存使用少版本

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

假设输入仅为A-Z字母。在这种情况下,你将只有26个可能的字符。因此,只要使用哈希表来存储输入字符的计数,一旦输入存储在哈希表中。现在只需使用这个函数来获取输出。

while(hash中有任何项){

for(i 1 to 26){

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

}

}

将对象放入hashmap中,以其值作为键,并使用计数器表示出现次数(同时保留插入顺序)。然后创建输出列表,迭代映射中的键并附加每个键值,同时减少其计数。重复,直到地图耗尽。以下是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

相关内容

  • 没有找到相关文章

最新更新