Tråd: Java oppgave
View Single Post
Hei.

Her er et raskt utkast.
Ikke akkurat vakkert og lagt fra feilfritt, men kanskje du kan la deg inspirere til å gjøre dette bedre?

Inputfilen inneholder (sauId - minutter):

Kode

2 34
1 2
9 32
1 6
4 7
2 4
Resultatet som kommer i output-filen er:

Kode

Total drikketid for sau med id: 1 er: 8 minutter
Total drikketid for sau med id: 2 er: 38 minutter
Total drikketid for sau med id: 4 er: 7 minutter
Total drikketid for sau med id: 9 er: 32 minutter


Verdier for alle sau:
Gjennomsnitt: 14 minutter
Minste drikketid: 2 minutter
Største drikketid: 34 minutter
Kildekode (start main i din favoritt-IDE for å kjøre):

Kode

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class SauApplication {
    private final Map<String, List<Integer>> sauOgDrikkeverdier = new HashMap<>();

    public SauApplication() throws Exception {
        lesInnLogfil();

        String resultater;
        resultater = kalkulerVerdierPerSau();
        resultater += kalkulerVerdierForAlleSauer();
        lagreVerdierTilFil(resultater);
    }

    private void lagreVerdierTilFil(String resultat) throws FileNotFoundException {
        try (PrintWriter out = new PrintWriter("src/resultat.txt")) {
            out.println(resultat);
        }
    }

    private String kalkulerVerdierForAlleSauer() {
        List<Integer> allValues = sauOgDrikkeverdier.values()
                .stream()
                .flatMap(List::stream)
                .collect(Collectors.toList());

        int gjennomsnitt = (int) allValues
                .stream()
                .mapToInt(Integer::intValue)
                .average()
                .getAsDouble();

        int min = allValues
                .stream()
                .mapToInt(Integer::intValue)
                .min()
                .getAsInt();

        int max = allValues
                .stream()
                .mapToInt(Integer::intValue)
                .max()
                .getAsInt();

        return "\n\nVerdier for alle sau:\n" +
                "Gjennomsnitt: " + gjennomsnitt + " minutter\n" +
                "Minste drikketid: " + min + " minutter\n" +
                "Største drikketid: " + max + " minutter\n";
    }

    private String kalkulerVerdierPerSau() {
        StringBuilder verdierPrSau = new StringBuilder();

        for (String sauId : sauOgDrikkeverdier.keySet()) {
            int antallMinutter = sauOgDrikkeverdier.get(sauId)
                    .stream()
                    .mapToInt(Integer::intValue)
                    .sum();

            verdierPrSau
                    .append("Total drikketid for sau med id: ")
                    .append(sauId).append(" er: ")
                    .append(antallMinutter)
                    .append(" minutter\n");
        }

        return verdierPrSau.toString();
    }

    private void lesInnLogfil() throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader("src/log.txt"))) {
            String linje;
            while ((linje = br.readLine()) != null) {
                String[] sauOgTidLinje = linje.split(" ");
                String sau = sauOgTidLinje[0];
                String tid = sauOgTidLinje[1];

                sauOgDrikkeverdier.computeIfAbsent(sau, k -> new ArrayList<>());
                sauOgDrikkeverdier.get(sau).add(Integer.valueOf(tid));
            }
        }
    }

    public static void main(String[] argz) throws Exception {
        new SauApplication();
    }
}