通过对象的给定构造函数值对对象的ArrayList进行排序

时间:2014-05-16 15:46:34

标签: java sorting arraylist

我的问题的重点是takeInventory()方法。

您可以假设InventoryDemo的{​​{1}}方法功能正常(除了main()方法的实现)。

如果您愿意,您可以找到其他课程here

我的takeInventory()方法的目标是对takeInventory()进行排序,并报告list类型的每个唯一实例的整数值。

这只能通过名称来区分:

  

产品(名称,费用))。

同名的

Product应该组合在一起(无论成本如何)。

输出应该报告:

This shows the desired output.

我假设有一种对这些数据进行排序的方法,这种方法比我目前的方法更有效。但是,我不知道一个。

Product

如果没有明确说明:

我想为我的import java.util.*; public class InventoryDemo { public static void main(String [] args) { ArrayList<Product> list = new ArrayList<Product>(); list.add(new Car("Jaguar", 1000000)); list.add(new Car("Neon", 17000)); list.add(new Tool("JigSaw", 149.18)); list.add(new Car("Jaguar", 110000)); list.add(new Car("Neon", 17500)); list.add(new Car("Neon", 17875.32)); list.add(new Truck("RAM", 35700)); list.add(new Tool("CircularSaw", 200)); list.add(new Tool("CircularSaw", 150)); list.add(new Tool("saw1", 200)); list.add(new Tool("saw2", 150)); if(list.get(9).compareTo(list.get(10)) == 0) { System.out.println("\nBoth saws are of equal value."); } else if(list.get(9).compareTo(list.get(10)) > 0) { System.out.println("\nThe first saw is more expensive."); } else { System.out.println("\nThe second saw is more expensive."); } takeInventory(list); } public static void takeInventory(ArrayList<Product> list) { int inventory[] = new int[list.size()]; int counter = 0; for(Product token: list) { for(int x = 0; x < list.size(); x++) { if(token.compareTo(list.get(x)) == 0) { inventory[counter] = 0; } else { counter++; } } } for(int token : inventory) { System.out.println(token); } } } 方法提供补救措施。此方法的客观意图是对给定的takeInventory()个对象进行排序,并报告其唯一类型值的总和成本。这在输出中清楚地证明了。输出的最后一个字符串文字是由我的main()方法中的条件产生的。其余的将由ArrayList方法生成。

我确定我当前的takeInventory() 正在工作。

3 个答案:

答案 0 :(得分:3)

我会构建一个Map<String, C>,其中C是一个包含数量(int)和费用(double)的帮助程序类。遍历产品列表和每个产品:

  • 如果名称不在地图中,请将名称与new C(1, cost)相关联。
  • 如果名称位于地图中,请按1增加与该名称相关联的数量,并通过cost增加与该名称相关的费用。

最后,遍历地图并打印结果;然后你就完成了。

参考:http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

以下是一些代码:

import java.util.*;

class Product {
    private String name;
    private double cost;

    public Product (String name, double cost) {
        this.name = name;
        this.cost = cost;
    }

    public String getName() {
        return name;
    }

    public double getCost() {
        return cost;
    }
}

class Car extends Product {
    public Car(String name, double cost) {
        super(name, cost);
    }
}

class Truck extends Product {

    public Truck(String name, double cost) {
        super(name, cost);
    }
}

class Tool extends Product {

    public Tool(String name, double cost) {
        super(name, cost);
    }   
}



class Entry {
    private int quantity = 1;
    private double cost;

    public int getQuantity() {
        return quantity;
    }

    public double getCost() {
        return cost;
    }

    public Entry(double cost) {
        this.cost = cost;
    }

    public void add (double cost) {
        quantity++;
        this.cost += cost;
    }

    @Override
    public String toString() {
        return ("Quantity = " + quantity + ", Total cost = " + cost);
    }
}


public class Inventory {

    static void takeInventory(List<Product> list) {
        Map<String, Entry> map = new HashMap<>();

        for (Product p : list) {
            Entry e = map.get(p.getName());
            if (e == null) {
                map.put(p.getName(), new Entry(p.getCost()));
            } else {
                e.add(p.getCost());
            }
        }

        for (String s : map.keySet()) {
            System.out.print(s);
            Entry e = map.get(s);
            System.out.println(" " + e);            
        }
    }

    public static void main(String [] args) {
        ArrayList<Product> list = new ArrayList<Product>();
        list.add(new Car("Jaguar", 100000));
        list.add(new Car("Neon", 17000));
        list.add(new Tool("JigSaw", 149.18));
        list.add(new Car("Jaguar", 110000));
        list.add(new Car("Neon", 17500));
        list.add(new Car("Neon", 17875.32));
        list.add(new Truck("RAM", 35700));
        list.add(new Tool("CircularSaw", 200));
        list.add(new Tool("CircularSaw", 150));
        list.add(new Tool("saw1", 200));
        list.add(new Tool("saw2", 150));

        takeInventory(list);
    }
}

输出:

saw1 Quantity = 1, Total cost = 200.0
saw2 Quantity = 1, Total cost = 150.0
CircularSaw Quantity = 2, Total cost = 350.0
RAM Quantity = 1, Total cost = 35700.0
JigSaw Quantity = 1, Total cost = 149.18
Jaguar Quantity = 2, Total cost = 210000.0
Neon Quantity = 3, Total cost = 52375.32

答案 1 :(得分:1)

与@ Zoyd的答案类似,您可以拥有Map<String, List<Product>>,然后将每个产品添加到地图中,如下所示:

Map<String, List<Product>> productMap = new HashMap<>();
for(Product product : list) {
    if (!productMap.containsKey(product.getName())) {
        productMap.put(product.getName(), new ArrayList<Product>());
    }
    productMap.get(product.getName()).add(product);
}

然后在您的打印方法中,您可以遍历地图键集,并将每个列表中的所有产品成本加起来,如下所示:

for(String productName : productMap.keySet()) {
    List<Product> products = productMap.get(productName);
    int quantity = products.size();
    double totalCost = 0.0;
    for (Product product : products) {
        totalCost += product.getCost();
    }
    System.out.println(String.format("%s: Quantity = %s, Total cost = %s", productName, quantity, totalCost));
}

答案 2 :(得分:0)

所以一个干净的方法是使用Guava的FluentIterable之一,根据某些规则,谷歌类用于过滤集合。首先制作一个谓词来定义你的排序:

class sorter implements Predicate<Product> {
    private final String name;
    sorter(String name){
        this.name=name
    }
    @Override
    boolean apply(Product input){
        return (input.name == this.name)
    }
}

如果input.name与为谓词指定的名称相同,则返回true。这与Guava的fluentIterable类一起使用,可以返回谓词为true的所有元素。 E.g。

List<Product> cars = FluentIterable.from(list).filter(new sorter("car"))

将生成名为“car”的所有元素的列表。

由于您将为每个名称迭代一次,因此它可能在大型集合上存在性能问题,另一方面,由于它只是只读且不会改变列表,因此您可以轻松地在本地多线程化。

虽然很容易阅读/维护。