Мне нужно суммировать определенные элементы в ArrayList
Допустим у меня есть такой список. Он у меня записывается в файл. Мне нужно написать код, который мог бы суммировать количество изделий всех категорий(A, B, C) определенной бригады. Допустим я указываю в консоли "Бригада 1", и он суммирует все собранные Бригадой 1 изделия всех категорий. Например, сумма всех собранных изделий Бригады 1: 1290 (200+250+240+60+210+80+90+75+85)
//создал вспомогательные массивы
public static ArrayList<Integer> bookCount = new ArrayList<>();
public static ArrayList<Integer> after2015 = new ArrayList<>();
public static ArrayList<List> list2 = new ArrayList<>();
public static ArrayList<ABC> abcs = new ArrayList<ABC>();
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = null;
ArrayList list = new ArrayList();
try {
File file = new File("newFile.txt");
if (!file.exists()) file.createNewFile();//если файла не существует, то создаем
PrintWriter printWriter = new PrintWriter(file);//выделяем память для PrintWriter
//записываем данные
printWriter.print("Иванов\n" +
"Бригада 1\n" +
"200\n" +
"250\n" +
"240\n" +
"Масляков\n" +
"Бригада 1\n" +
"60\n" +
"210\n" +
"80\n" +
"Соловьев\n" +
"Бригада 1\n" +
"90\n" +
"75\n" +
"85\n" +
"Муравьев\n" +
"Бригада 2\n" +
"150\n" +
"300\n" +
"205\n" +
"Тополев\n" +
"Бригада 2\n" +
"160\n" +
"95\n" +
"140\n" +
"Карпенко\n" +
"Бригада 2\n" +
"170\n" +
"195\n" +
"145");
printWriter.close();//закрываем PrintWriter
//для чтения создаем BufferReader
bufferedReader = new BufferedReader(new FileReader("newFile.txt"));
String line;
//пока есть что для чтения,все строки добавляем в массив
while ((line = bufferedReader.readLine()) != null) {
list.add(line);
}
//Делим список по 5 элементов(шифр,автор,название,год,количество)
int size = 5;
for (int start = 0; start < list.size(); start += size) {
int end = Math.min(start + size, list.size());
List sublist = list.subList(start, end);
list2.add(sublist);
}
} catch (FileNotFoundException e) {
System.out.println("Error: " + e);//При ошибке
} catch (IOException e) {
System.out.println("Error: " + e);//При ошибке
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
System.out.println("Error: " + e);
}
}
for (int i = 0; i < list2.size(); i++) {
System.out.println(list2.get(i));
}
list2.forEach((l) -> {
System.out.println(l.get(1));
ABC abc = new ABC();
abc.setFamilia((String) l.get(0));
abc.setBrigada((String) l.get(1));
abc.setIzdelieA(Integer.parseInt(l.get(2).toString()));
abc.setIzdelieB(Integer.parseInt(l.get(3).toString()));
abc.setIzdelieC(Integer.parseInt(l.get(4).toString()));
abcs.add(abc);
});
System.out.println(abcs);
Есть следующие переменные, геттеры и сеттеры
public static class ABC {
String familia;
String brigada;
int izdelieA;
int izdelieB;
int izdelieC;
public ABC() {
}
public String getFamilia() {
return familia;
}
public void setFamilia(String fam) {
this.familia = fam;
}
public String getBrigada() {
return brigada;
}
public void setBrigada(String brgd) {
this.brigada = brgd;
}
public int getIzdelieA() {
return izdelieA;
}
public void setIzdelieA(int izdA) {
this.izdelieA = izdA;
}
public int getIzdelieB() {
return izdelieB;
}
public void setIzdelieB(int izdB) {
this.izdelieB = izdB;
}
public int getIzdelieC() {
return izdelieC;
}
public void setIzdelieC(int izdC)
{
this.izdelieC = izdC;
}
}
Ответы (1 шт):
Я не знаю, в чем именно возникла проблема при решении задачи, но лично у меня написание данного кода заняло примерно 7-10 минут. Знаете почему? Потому что я его не писал с самого начала, я использовал уже существующий код. Посмотрите ссылки, которые я вам предоставлю. Я отвечал на очень похожие вопросы и это решение переиспользует указанный код с минимальными модификациями. Писать пояснения к этому коду я не буду, потому что все уже расписано по по указанным ссылкам. Мне кажется, что если бы вы воспользовались поисковиком, то могли бы таким же способом решить данную задачу. Итак, вот решение:
@lombok.Builder
@lombok.AllArgsConstructor
@lombok.ToString
@lombok.Getter
public class Worker implements CsvStore{
private final String surname;
private final String teamName;
private final int productA;
private final int productB;
private final int productC;
public Worker(String [] values) {
this.surname = values[0];
this.teamName = values[1];
this.productA = Integer.valueOf(values[2]);
this.productB = Integer.valueOf(values[3]);
this.productC = Integer.valueOf(values[4]);
}
public long sumProduct(){
return productA + productB + productC;
}
@Override
public String toCsv(String delimiter){
final StringBuilder sb = new StringBuilder();
return sb.append(surname).append(delimiter)
.append(teamName).append(delimiter)
.append(productA).append(delimiter)
.append(productB).append(delimiter)
.append(productC).append(delimiter)
.toString();
}
}
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@FunctionalInterface
public interface CsvStore {
public static <T extends CsvStore> void save(String fileName, Collection<T> collection, String delimiter) throws IOException {
Files.write(Paths.get(fileName), collection.stream()
.map(e->e.toCsv(delimiter))
.collect(Collectors.joining("\r\n")).getBytes());
}
public static <T extends CsvStore> List<T> load(String fileName,
String delimiter, Function <String[], T> function) throws IOException {
try (Stream<String> stream = Files.lines(Paths.get(fileName), Charset.defaultCharset())) {
return stream.map(line -> function.apply(line.split(delimiter)))
.collect(Collectors.toList());
}
}
public String toCsv(String delimiter);
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
private static final String FILE_NAME = "Workers.txt";
private final static String DELIMITER = ";";
public static void main(String[] args) throws IOException {
List<Worker> workers = new ArrayList<>();
workers.add(Worker.builder().surname("Иванов").teamName("Бригада 1").productA(200).productB(250).productC(240).build());
workers.add(Worker.builder().surname("Масляков").teamName("Бригада 1").productA(60).productB(210).productC(80).build());
workers.add(Worker.builder().surname("Соловьев").teamName("Бригада 1").productA(90).productB(75).productC(85).build());
workers.add(Worker.builder().surname("Муравьев").teamName("Бригада 2").productA(150).productB(300).productC(205).build());
workers.add(Worker.builder().surname("Тополев").teamName("Бригада 2").productA(160).productB(95).productC(140).build());
workers.add(Worker.builder().surname("Карпенко").teamName("Бригада 2").productA(170).productB(195).productC(145).build());
CsvStore.save(FILE_NAME, workers, DELIMITER);
workers = CsvStore.load(FILE_NAME, DELIMITER, values -> new Worker(values));
Scanner sc = new Scanner(System.in);
String teamName = sc.nextLine();
long sum = workers.stream()
.filter(worker->teamName.equals(worker.getTeamName()))
.map(worker->worker.sumProduct())
.mapToLong(Long::valueOf)
.sum();
System.out.println(sum);
}
}
А ссылки в комментариях к ответу.