Java:组合2 List <string []> </string []>

时间:2010-06-06 11:02:26

标签: java string list arrays

我有两个数组字符串列表。我希望能够通过组合2个列表来创建新列表(newList)。但它必须满足这三个条件:

1)将store_inventory的内容复制到newList。

2)然后如果商品名称在store_inventory&amp; new_acquisitions匹配,只需将两个数量相加并在newList中更改它。

3)如果new_acquisitions有一个store_inventory中不存在的新项目,则将其添加到newList。

CSV列表的标题是:项目名称,数量,成本,价格。

列表包含每行的项目名称,数量,成本和价格的字符串[]。

    CSVReader from = new CSVReader(new FileReader("/test/new_acquisitions.csv"));
    List <String[]> acquisitions = from.readAll();

    CSVReader to = new CSVReader(new FileReader("/test/store_inventory.csv"));
    List <String[]> inventory = to.readAll();

    List <String[]> newList;

让我入门的任何代码都会很棒! =]

这就是我到目前为止......

        for (int i = 0; i < acquisitions.size(); i++) {
        temp1 = acquisitions.get(i);
        for (int j = 1; j < inventory.size(); j++) {
            temp2 = inventory.get(j);
            if (temp1[0].equals(temp2[0])) {
                //if match found... do something?



                //break out of loop
            }
        }
        //if new item found... do something?
    }

1 个答案:

答案 0 :(得分:4)

我首先将newList构建为HashMap或TreeMap而不是List。这样可以轻松搜索匹配的记录。此外,我会将String []转换为包含名称,数量,成本和价格字段的自定义对象(例如Record)。这将负责复制信息。你可以尝试这样的事情:

Map<String, Record> newMap = new TreeMap<String, Record>();
for(String[] ss : acquisitions) {
    Record rec = Record.parse(ss); // For requirement (1)
    newMap.put(rec.getName(), rec);
}

for(String[] ss : inventory) {
    Record rec = Record.parse(ss); // For requirement (1)
    if(newMap.containsKey(rec.getName())) {
        // For requirement (2)
        // The mergeWith method can then add quantities together
        newMap.get(rec.getName()).mergeWith(rec);
    } else {
        // For requirement (3)
        newMap.put(rec.getName(), rec);
    }
}

修改的 拥有Record对象的另一个好处是,通过实现toString功能,可以更轻松地将其打印到屏幕上。

public class Record implements Comparable<Record> {
    public static Record parse(String[] ss) {
        // TODO: implement some basic parsing
    }

    private String name;
    private int quantity;
    private BigDecimal cost, price;

    private Record() {}

    public String getName() { return name; }
    public int getQuantity() { return quantity; }
    public BigDecimal getCost() { return cost; }
    public BigDecimal getPrice() { return price; }

    public int compareTo(Record other) {
        return this.name.compareTo(other.name);
    }

    public String toString() {
        return name;
    }
}