按类型和对象顺序自定义排序并返回列表列表

时间:2015-02-22 17:07:30

标签: java c# algorithm data-structures

以下是按类型和给定顺序对某些对象进行排序的问题。 所以,我有几种类型的对象:比如t1,t2,t3,t4,t5,t6,t7。 和几个插槽:说插槽1,插槽2,插槽3,插槽4,插槽5。 我按特定顺序给出了一系列对象。

我的目标是返回一个充满符合以下条件的对象的插槽数组:

  • slot1:可以容纳多个对象。只有t1类型的对象可以到这里
  • slot2:可以容纳多个对象。只有t2类型的对象可以到这里
  • slot3:只能容纳1个对象。 t3类型的对象可以在这里。但是如果没有t3对象,我们将检索t4类型的对象。如果没有类型为t4的对象,我们将从t5中检索,依此类推。另外,如果有多个相同类型的对象,我们从输入数组中取第一个。
  • slot4:只能容纳1个对象。 t4类型的对象可以在这里。但是如果没有t4对象,我们将检索t5类型的对象。如果没有类型为t5的对象,我们将从t6中检索,依此类推。另外,如果有多个相同类型的对象,我们从输入数组中取第一个。
  • slot5:只能容纳1个对象。 t5类型的对象可以在这里。但是如果没有t5对象,我们将检索t6类型的对象。如果没有类型为t6的对象,我们将从t7中检索,依此类推。另外,如果有多个相同类型的对象,我们从输入数组中取第一个。
  • 等......

因此,对于上述条件,如果我有5个输入对象:object1,object2,object3,object4,object5和4个slot:slot1,slot2,slot3,slot4。 在哪里,

  • object1 - t1
  • object2 - t3
  • object3 - t5
  • object4 - t5
  • object5 - t6
  • object6 - t1

输出结果为:

  • slot1将包含object1,object6
  • slot2将包含null
  • slot3将包含object2
  • slot4将包含object3

我希望这很清楚。我知道Slot1和Slot2很特别。从第3个插槽开始,所有其他插槽都遵循类似的条件。

我正在尝试编写一个函数来返回带有填充对象的插槽数组。同时我想用一个好的设计来组织它 - 就像有一个配置,它有一些方法可以确定哪些类型在哪些插槽中定义以及定义对象的类型。

到目前为止我尝试过:

class MyObject 
{
  String type;
}

class Slot
{
  int capacity;
  MyObject[] canContain;
}

class MyProject
{
  Slot Slot1 = new Slot { capacity: 100, canContain: {"type1"}) 
  Slot Slot2 = new Slot { capacity: 100, canContain: {"type2"}) 
  Slot Slot3 = new Slot { capacity: 1, canContain: {"type3", "type4"}) 
  Slot Slot4 = new Slot { capacity: 1, canContain: {"type4", "type5"}) 

  void getSlots(MyObject[] objects) 
  {
     // I would end up using multiple for loops here for each slot
     // not sure if that is the right approach
     // if it is, just let me know and I could proceed
     // if not, is there another good way of approaching this
  }
}

感谢任何帮助。谢谢!

首选语言:C#或Java。

1 个答案:

答案 0 :(得分:0)

继续设计的一些想法:

如果您知道不同类型的对象,请使用枚举来定义它。 处理逻辑可以在一个类中,并使用如下数据结构:

Map<ItemType, List<Slot>> slots = new HashMap<>();

对于您需要存储的每个项目,处理将通过按对象类型获取地图来查找可以存储它的插槽。 List<Slot>可以通用方式处理插槽的两个规则: 该列表包含可以存储给定类型的对象的槽。您可以使用LinkedList实现优先级列表槽 - 如果达到了插槽容量,请查看列表中的下一个,等等。 当插槽列表只包含一个插槽时,这将处理插槽只能处理相同类型的对象的情况。