过滤地图的方法

时间:2014-05-06 14:38:09

标签: java map hashmap

我有以下格式的数据(都是双倍的)

Price1         Price2
1.2             5.1
3.2             4.2
1.4             1.4
1.3             1.1

我希望price1price2相互关联。我需要按降序排序price2,然后删除最后一条记录。然后我需要按降序排序price1

最佳方法是什么? - 哪种数据类型?我正在考虑使用hashmap但是没有位置的概念,虽然我可以做一些解决但是它会很混乱。也可以创建一个对象来存储它们,然后做一个类似的但是在想我是否可以在几行代码中做到这一点?不确定更好的选择是否可行而且好奇:)

2 个答案:

答案 0 :(得分:0)

在Java8中,您可以这样做:

int[] prices1 = ...
int[] prices2 = ...
IntStream.range(0, prices1.length)
        .map(i -> new Map.Entry<>(prices1[i], prices2[i]))
        .sorted((entry1, entry2) -> {
            return Integer.compare(entry1.getValue(), entry2.getValue())
        })
        .skip(1)
        .sorted((entry1, entry2) -> {
            return Integer.compare(entry1.getKey(), entry2.getKey())
        })
        ...

答案 1 :(得分:0)

与@dasblinkenlight回答相似,

声明新的对象价格以保存值

class Prices {
    BigDecimal price1;
    BigDecimal price2;
    public Prices(BigDecimal price1, BigDecimal price2) {
        this.price1 = price1;
        this.price2 = price2;
    }
    public BigDecimal getPrice1() {
        return price1;
    }
    public void setPrice1(BigDecimal price1) {
        this.price1 = price1;
    }   
    public BigDecimal getPrice2() {
        return price2;
    }
    public void setPrice2(BigDecimal price2) {
        this.price2 = price2;
    }
    @Override
    public String toString(){
        return String.valueOf(price1).concat(" ").concat(String.valueOf(price2));
    }
}

由于涉及价格,将变量声明为大十进制。你可以在SO中找到很多答案,为什么你应该使用BigDecimal而不是double。

根据您的要求,我认为您不需要根据price2对元素进行排序。 您的要求是删除最小的price2元素并按price1

排序
class PriceComparator implements Comparator<Prices>{
    @Override
    public int compare(Prices o1, Prices o2) {
        return o2.getPrice1().compareTo(o1.getPrice1());
    }

    public  int getLeastPrice2(List<Prices> collections){
        int i =0;
        BigDecimal lowValue = collections.get(0).getPrice2();
        for (int j = 1; j < collections.size(); j++) {
            if (collections.get(j).getPrice2().compareTo(lowValue) < 0 ) {
                lowValue =  collections.get(j).getPrice2();
                i = j;
            }
        }
        return i;

    }
}

比较器基于price1和其他方法来查找price2的最小位置

现在测试

List<Prices> priceList = new ArrayList<Prices>();
        Prices p1 = new Prices(BigDecimal.valueOf(1.2), BigDecimal.valueOf(5.1));
        Prices p2 = new Prices(BigDecimal.valueOf(3.2), BigDecimal.valueOf(4.2));
        Prices p3 = new Prices(BigDecimal.valueOf(1.4), BigDecimal.valueOf(1.4));
        Prices p4 = new Prices(BigDecimal.valueOf(1.3), BigDecimal.valueOf(1.1));
        priceList.add(p1);
        priceList.add(p2);
        priceList.add(p3);
        priceList.add(p4);
        System.out.println(priceList);
        PriceComparator priceComparator = new PriceComparator();
        priceList.remove(priceComparator.getLeastPrice2(priceList));
        System.out.println(priceList);
        Collections.sort(priceList, priceComparator);
        System.out.println(priceList);

out put

[1.2 5.1, 3.2 4.2, 1.4 1.4, 1.3 1.1]
[1.2 5.1, 3.2 4.2, 1.4 1.4]
[3.2 4.2, 1.4 1.4, 1.2 5.1]