Найти строку в двумерном массиве и затем go в соответствующий столбец - PullRequest
0 голосов
/ 27 апреля 2020

Итак, я конвертирую CSV в массив. CSV имеет первый столбец, который состоит из заголовков и описания того, что находится в этом столбце. В моем случае: идентификатор продукта | название продукта | стоимость продукта | количество

Я пытаюсь go через массив найти строку item1, а затем go до количества этого элемента, которое находится в той же строке, но в другом столбце.

Например:

ID продукта | название продукта | стоимость продукта | количество

----- 001 ----- | ----- item1 ----- | ----- 5,99 ----- | ----- 3 -----

----- 002 ----- | ----- пункт2 ----- | ----- 2.99 ----- | ----- 5 -----

Так что я хочу go этот массив, найти строку item1 в индексе строки 1, затем go в индексе столбца 3, чтобы извлечь количество в переменную. Затем я хочу сохранить в переменную, чтобы в итоге распечатать there are only 3 item1's left или что-то в этом роде.

Вот что я получил до сих пор:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class test2 {

    public static List<List<String>> csvToArray() {
        String fileName = "c:\\temp\\test.csv";
        File file = new File(fileName);

        // this gives you a 2-dimensional array of strings
        List<List<String>> lines = new ArrayList<>();
        Scanner inputStream;

        try {
            inputStream = new Scanner(file);

            while (inputStream.hasNext()) {
                String line = inputStream.next();
                String[] values = line.split(",");
                // this adds the currently parsed line to the 2-dimensional string array
                lines.add(Arrays.asList(values));
            }

            inputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        return lines;
    }

    public static void printArray(List<List<String>> lines){
        int lineNo = 1;
        for (List<String> line : lines) {
            int columnNo = 1;
            for (String value : line) {
                System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);
                columnNo++;
            }
            lineNo++;
        }
    }

    public static void main(String[] args) {
        csvToArray();
        printArray(csvToArray());
    }
}

Как вы можете видеть, в метод printArray Я просто распечатываю Массив, чтобы получить справку о том, где я нахожусь, но как только я пытаюсь добавить if, я теряюсь.

Любая помощь будет отличной: )

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

Было бы лучше, если бы вы использовали List<String[]> вместо List<List<String>>. Но для вашей проблемы вы можете сделать что-то вроде этого:

for (int i = 0; i < lines.size(); i++)
    System.out.println("There are only " + lines.get(i).get(3).replace("-", "") + " " + lines.get(i).get(1).replace("-", "") + "'s left");
0 голосов
/ 27 апреля 2020

Определите индексы интересующих столбцов и итерируйте по строкам, печатая и передавая переменную для будущего использования по пути. Создание класса для представления строки в формате csv здесь кажется чрезмерным, но, конечно, зависит от требований.

Код: не проверен .

/*
   Preprocessing:
   Determine column indexes of product name and quantity.
   Use the informstion available.

   Simple case: column indices are known beforehand.

   This code scans the csv header lines for given strings.
*/
final String s_HEADER_PRODUCT   = "product name";
final String s_HEADER_QUANTITY  = "quantity";

HashMap<String, int> quantities = new HashMap<String, int>();

int idxProduct   = -1;
int idxQuantity  = -1;

List<String> headers = lines[0];
int columnNo = 0;
for ( columnNo = 0; columnNo < headers.size(); columnNo++ ) {
    if ((idxProduct < 0)  && headers[columnNo].equals( s_HEADER_PRODUCT )) { idxProduct = columnNo; }
    if ((idxQuantity < 0) && headers[columnNo].equals( s_HEADER_QUANTITY )) { idxQuantity = columnNo; }
    if ((idxProduct >= 0) && (idxQuantity >= 0)) {
        break;
    }
}

/*
   Print out.
   After the loop, 'quantities' will hold a map of product names onto quantities.

   Assumptions:
      - Quantities are integer values.
      - Product names are unique within the file.
 */
lineNo = 0; 
for (List<String> line : lines) {
    if (lineNo > 0) { // skip header line 
        System.out.println("Item '" + line.get(idxProduct) + "': " + line.get(idxQuantity) + " specimens left.");
        quantities.put ( line.get(idxProduct), Integer.parseInt ( line.get(idxQuantity) );
    }
    lineNo++;
}
0 голосов
/ 27 апреля 2020

Лучшее решение - сопоставить каждую строку с объектом «Продукт». Этот класс новостей будет содержать такие атрибуты, как productID, productName, productCost & amount.

Как только каждая строка сопоставляется с объектом product, вам просто нужно найти продукт с нужным productName, а затем получить доступ к другим его свойствам. легко.

...