找到50个最便宜的非匹配价格

时间:2017-06-12 15:37:13

标签: java groovy

鉴于一系列价格(如341.95),我如何才能找到最便宜的50个价格?

诀窍是阵列中的一些价格可以匹配,50的列表应该是唯一的价格。例如,如果123.45中有6个价格,我只想在我的最终清单50中有一个。不能有任何重复。

我认为最好的方法是将该数组吸入并插入第二个数组,过滤掉任何匹配的数字,但说起来容易做起来难。

6 个答案:

答案 0 :(得分:2)

使用Java 8流:

int[] lowestPrices = Arrays.stream(prices)
   .sorted()
   .distinct()
   .limit(50)
   .toArray();

请注意,即使您使用“123.45”作为示例,我也使用了int[]。使用浮点货币价值是一个糟糕的想法,因此代表123.45美元为12345美分。

答案 1 :(得分:1)

最佳就地解决方案

  1. 对数组进行排序
  2. 迭代升序(从最便宜的开始)并连续添加每个新号码(你在上一次迭代中没有看到)

答案 2 :(得分:1)

以下是您问题的更加流行的解决方案

//priceArray is your input array
def firstFiftyPrices = priceArray.unique().sort()​.take(50)​

答案 3 :(得分:0)

遍历数组,将每个项目添加到TreeSet,然后返回前50个元素的列表。

答案 4 :(得分:0)

根据每个人的输入,我想出了它,它似乎工作。 minimumPrices是我的价格清单,谢谢大家!

 Object[] st = lowestPrices.toArray();
 for (Object s : st) {
      if (lowestPrices.indexOf(s) != lowestPrices.lastIndexOf(s)) {
           lowestPrices.remove(lowestPrices.lastIndexOf(s));
      }
  }

  System.out.println("Distinct List " + lowestPrices)

答案 5 :(得分:0)

如果你有一个Double对象数组,你可以使用Groovy JDK's toUnique, sort, and take methods找到最低的50个价格。

// generate some random prices
def r = new Random()
Double[] allPrices = (0..100).collect { (r.nextDouble() * 100).trunc(2) }

Double[] lowestPrices = allPrices.toUnique().sort().take(50)

向@cfrick提示,建议使用take而不是范围和Math.min语法。