按类型和日期对可变大小数据对对象列表进行排序和分组

时间:2014-09-15 21:39:26

标签: java algorithm

我正在解决一个问题。我必须准备一个目的地列表,用于在UI上显示数据。源列表是外部Web服务返回的列表。

对象大小的源列表可以是0到16.另一个列表需要形成最多8个对象。

对象属性是name,type,availableUntilDate和其他一些。

理想情况下,新列表应该有4个类型为“NEW”和4个“非NEW”的对象。可以使用Non-New,例如new,mint等。

如果源列表中至少有4个“NEW”类型的对象,则可以获取非NEW对象。 同样,如果源列表中至少没有4个非新的,则可以使用“new”来填充目标列表。

每个组应首先按“NEW”排序,并使用最新的availableUntilDate。

有人可以给我指针或算法。

以下是目的地列表的理想结果:

**book_name  type  availableUntilDate** 

Book1      NEW    4/15/2014 6 PM 
Book2      NEW    4/15/2014 7 PM    
Book3      NEW    4/15/2014 8 PM    
Book4      NEW    4/15/2014 9 PM

Book5      OLD    4/15/2014 5 PM    
Book6      MINT   4/15/2014 5.30 PM    
Book7      OLD    4/15/2014 7 PM    
Book8      MINT   4/15/2014 8.30 PM

我的想法是创建两个临时列表。 新列表和非新列表。 循环时,通过检查类型将每个对象添加到相应的列表中。如果任何列表的大小为4,则不会添加新对象。循环之后,合并两个列表。 如果源列表不满足理想情况,我会陷入如何处理这个问题。

2 个答案:

答案 0 :(得分:0)

不要将临时列表限制为四个项目。假设您有一个包含所有新项目的列表和另一个包含所有非新项目的列表,那么解决方案的大纲是:

while (!goalReached()) {
    int progress = answer.addFrom(newItems) + answer.addFrom(oldItems);
    if (progress == 0) break;
}
Collections.sort(answer, myComparator);

,其中

    如果答案有8个项目,则
  • goalReached需要返回true。

  • addFrom必须从arg中移除最佳项目并将其添加到answer,如果没有可用项目则返回0,否则返回1.

  • myComparator必须先按类型排序,然后按日期排序。

答案 1 :(得分:0)

解决方案是使用复合比较器:

books.stream().sorted(Comparator
        .comparing(b->b.type)
        .thenComparing(b->b.availableUntilDate))
    .limit(4).forEach(b->{
    //whatever you want to do with them
});

这会给你一本书