Java: объединить 2 списка <String []> - PullRequest
0 голосов
/ 06 июня 2010

У меня есть два списка строки массива. Я хочу иметь возможность создать новый список (newList) путем объединения 2 списков. Но он должен соответствовать этим 3 условиям:

1) Скопируйте содержимое store_inventory в newList.

2) Затем, если имена элементов в store_inventory & new_acquisitions совпадают, просто сложите две величины вместе и измените их в newList.

3) Если в new_acquisitions есть новый элемент, которого нет в store_inventory, то добавьте его в новый список.

Названия списка 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 Ответ

4 голосов
/ 06 июня 2010

Я бы начал с создания newList в виде HashMap или TreeMap вместо List. Это облегчает поиск соответствующей записи. Кроме того, я бы преобразовал String [] в пользовательский объект (например, запись), который содержит поле имени, количества, стоимости и цены. Это позаботится о копировании информации. Вы можете попробовать что-то вроде этого:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...