Чтение данных из файла и работа с ними

451
30 декабря 2016, 10:39

Задача :

Есть файл. Количество строк неизвестно.Каждая строка файла,представляет собой запись вида :

Покупатель Товар Количество

Нужно создать массив со всеми покупателями.

Для каждого покупателя подсчитать количество приобретенных им единиц каждого вида товаров.

Список вывести в алфавитном порядке фамилий покупателей.

Входные данные из файла :

Иванов газета 10
Петров ручка 5
Николаев тетрадь 3
Иванов ручка 2
Николаев ручка 1
Петров тетрадь 2
Николаев газета 1

Выводимые данные на экран :

Иванов : газета - 10 шт ; ручка - 5 шт ;
Николаев : газета - 1 шт ; ручка - 1 шт ; тетрадь - 3 шт;
Петров : ручка - 5 шт ; тетрадь - 2 шт;

Мой код :

package semnadcat;
import java.io.IOException;
import java.io.*;
/**
 *
 * @author Марат
 */
public class Semnadcat2 {
 public static void main(String args[]) {
        try(FileReader reader = new FileReader("C:\\SomeDir\\notes3.txt")){
            int c;
            while((c=reader.read())!=-1){
                System.out.print((char)c);
            } 
        }
        catch(IOException ex){
            System.out.println(ex.getMessage());
        }   
 System.out.println(" ");
 } 
}

Мои ошибки:

Не понимаю каким образом можно сохранять в массив данные файла. Удается только посимвольно вытащить информацию на экран.

Answer 1

В самом примитивном случае можно сделать так:

Создаете класс Customer:

public class Customer {
    private String mSurname;
    private String mProduct;
    private int mAmount;
    public Customer(String line) {
        String[] customer = line.split(" ");
        mSurname = customer[0];
        mProduct = customer[1];
        mAmount = Integer.parseInt(customer[2]);
    }
    public String getSurname() {
        return mSurname;
    }
    public String getProduct() {
        return mProduct;
    }
    public int getAmount() {
        return mAmount;
    }
}

Создаете ArrayList<Customer> и заполняете его данными из файла:

ArrayList<Customer> customers = new ArrayList<>();
BufferedReader bufferedReader = new BufferedReader(new FileReader("Customers.txt"));
String currentLine;
while ((currentLine = bufferedReader.readLine()) != null) {
    customers.add(new Customer(currentLine));
}
bufferedReader.close();

А дальше совсем просто.

UPD:

Вывод информации о покупателях на консоль:

  • С помощью обычного цикла for:

    for (int i=0; i<customers.size(); i++) {
        Customer customer = customers.get(i);
        System.out.println(customer.getSurname() + " | " + customer.getProduct() + " | " + customer.getAmount());
    }
    
  • С помощью цикла for в стиле for each:

    for (Customer customer : customers) {
        System.out.println(customer.getSurname() + " | " + customer.getProduct() + " | " + customer.getAmount());
    }
    
  • С помощью Stream API (Java 8):

    customers.stream()
            .map(x -> x.getSurname() + " | " + x.getProduct() + " | " + x.getAmount())
            .forEach(System.out::println);
    
READ ALSO
Не выводит одно слово при формировании списка словосочетаний

Не выводит одно слово при формировании списка словосочетаний

Из кода выводится список сформированных по длине словосочетания, которые в дальнейшем печатаются на imageНе могу придумать условие, чтобы...

390
Отслеживать открытие Spinner

Отслеживать открытие Spinner

Хочу отслеживать событие открытия SpinnerПопробовал повесить на него View

363
Json java. Parse to string

Json java. Parse to string

Как правильно парсить данный json

473
Нажатие на элемент recyclerView

Нажатие на элемент recyclerView

Пишу тест, в котором хочу обработать нажатие на элемент списка recyclerView

560