【问题标题】:Issue with Sorting List using collections in java使用java中的集合排序列表的问题
【发布时间】:2014-10-22 10:00:34
【问题描述】:

我有一个包含订单条目的列表。每个订单条目都有一个基准价格。我想按 entry.basePrice 降序对这个列表进行排序(enty.basePrice == 0 条目应该在底部)。

在此列表中,要么没有条目有 0 价格,要么有一个条目。我就是这样的..

final Collection<AbstractOrderEntryModel> orderEntry = Collections2.filter(source.getEntries(),
            new Predicate<AbstractOrderEntryModel>()
            {
                @Override
                public boolean apply(final AbstractOrderEntryModel arg)
                {
                    return arg.getBasePrice().doubleValue() == 0 ? true : false;
                }
            });

在这里,我过滤了 baseprice = 0.0 的条目 现在我将如何在 OrderEntry List 中删除和添加这个项目 (orderEntry.iterator().next()) 最后?

如果它不是推荐的解决方案,并且可以通过 Collections.sort 也可以,那么请给我解决方案。

【问题讨论】:

  • 您可以将这些条目存储在其他地方并在过滤后将它们包含在最后吗?
  • 你可以编写一个自定义的比较器来比较订单对象的价格。然后使用 Collections.sort(...) 进行排序。
  • 这些扭曲的布尔表达式永远存在……arg.getBasePrice().doubleValue() == 0 已经是truefalse。为什么要在后面加上? true : false,只是为了炫耀你知道三元运算符?
  • @Holger 我总是问为什么只问一次。 (arg.getBasePrice().doubleValue() == 0 ? true : false) ? true : false 会更好吗?
  • 嘿,伙计们,我的问题不同,你去了另一个话题。你能告诉我一些例子吗?

标签: java sorting collections guava predicate


【解决方案1】:

据我了解,您希望将与谓词匹配的项目放在列表的末尾。这可以直接完成:

List<AbstractOrderEntryModel> list=source.getEntries()
final Collection<AbstractOrderEntryModel> orderEntry = Collections2.filter(list,
  new Predicate<AbstractOrderEntryModel>()
  {
    public boolean apply(final AbstractOrderEntryModel arg)
    {
        return arg.getBasePrice().doubleValue() == 0;
    }
  });
if(!orderEntry.isEmpty()) {
  assert orderEntry.size()==1; // so you said in your question
  AbstractOrderEntryModel e=orderEntry.iterator().next();
  list.remove(e);
  list.add(e);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2012-08-12
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多