收藏品排序对我不起作用

时间:2018-06-18 09:49:03

标签: java collections

我尝试使用Collections.sort,直到我希望它在双变量之间进行排序

价格是双重变量......

@Override
public int compareTo(Product p) {
    double lastCmp = this.price.compareTo(p.getPrice());
    return (lastCmp != 0 ? lastCmp : this.price.compareTo(p.getPrice()));
}

  public void OrganizeByLowestPrice(Basket basket) {
    ArrayList<Product> products1 = basket.getBasket();
    Collections.sort(products1, new Comparator<Product>() {
        @Override
        public int compare(Product product, Product t1) {
            return product.getPrice().compareTo(t1.getPrice());
        }
    });
}

https://pastebin.com/6VxhzSRG

我添加了Product的代码。 问题保持不变。 它曾经为我工作,但现在因为我正在恢复丢失的代码而不是。

2 个答案:

答案 0 :(得分:1)

所以这里真正的问题是编译错误。密切相关的是:

for (int i = 0; i < _downloadList.Count; i++)
            {
                var url = _downloadList.ToArray()[i];
                Task.Factory.StartNew
                (
                    async () =>
                    {
                        try
                        {
                            MegaApiClient client = new MegaApiClient();
                            //client.LoginAnonymous();
                            downloadIndex = i;

                            IProgress<double> progressHandler = new Progress<double>(p => HandleUnitProgressBar(p, downloadIndex));

                            await client.DownloadFileAsync(fileLink, url.Value, progressHandler);
                        }
                        catch (Exception e)
                        {
                            //will add later
                        }
                    }
                , CancellationToken.None
                , TaskCreationOptions.None
                , TaskScheduler.Current
            );
        }

这些是直截了当的:

  • 发生第一个错误是因为您尝试在Product.java:51: error: double cannot be dereferenced double lastCmp = this.price.compareTo(p.getPrice()); ^ Product.java:52: error: double cannot be dereferenced return (lastCmp != 0 ? lastCmp : this.price.compareTo(p.getPrice())); ^ Product.java:52: error: incompatible types: possible lossy conversion from double to int return (lastCmp != 0 ? lastCmp : this.price.compareTo(p.getPrice())); ^ 上调用方法(compareTo)。那不是有效的Java。原始类型没有方法。

  • 出现第二个错误的原因与第一个

  • 相同
  • 发生最终错误是因为double生成(lastCmp != 0 ? lastCmp : this.price.compareTo(p.getPrice())),但是。{ double方法必须返回Product::compareTo。因此,int语句尝试return转换为double。但是从intdouble的转换是有损的,并且Java语言需要显式类型转换来执行此操作。

解决方案:

  1. int变量不应为lastCmp。它应该是double

  2. 如果要比较两个int值,请使用静态double方法; e.g。

    Double::compare

答案 1 :(得分:0)

你可以简单地使用lambda。

public void OrganizeByLowestPrice(Basket basket) {
    ArrayList<Product> products1 = basket.getBasket();
    Collections.sort(products1, (a,b)->{
        return Double.compare(b.getPrice(),a.getPrice());
    });
}

它根据价格按递减顺序对列表进行排序。