Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  7 6775
Noen som er god til å programmere på java, som kunne hjulpet meg med en oppgave?
På et uteområde går det 10 sauer med digital id-brikke. Når en sau er innom drikkeautomaten,
blir det registrert hvilken sau det er og hvor lenge (målt i sekund) den drikker.
Sauens id er et tall (1-10) som lagres sammen med målt drikketid på en linje i en sekvensiell tekstfil etter hver registrering. Kun ett mellomrom brukes til å skille de to verdiene. Samme sau vil
typisk drikke flere ganger i løpet av et døgn, som er registreringstiden for hver slik fil (etter
midnatt startes det registrering på en ny fil).
Skriv et komplett Java-program som tar data fra slike filer og finner total drikketid for hver sau i
det døgnet filen dekker. Ut i fra dette skal programmet finne minste og største totale drikketid
blant alle sauer og beregne gjennomsnittlig drikketid for det aktuelle døgnet. Disse tre verdiene
skal skrives til en ny fil med «res_» foran navnet på filen med de tilhørende registrerte dataene.
Dette hørtes veldig ut som en skoleoppgave. Hva har du prøvd så langt? Hvilke problemer har du støtt på?
Trådstarter
4 0
hvor skal jeg begynne... sliter veldig
Sitat av Fendin Vis innlegg
hvor skal jeg begynne... sliter veldig
Vis hele sitatet...

Kode

public class Sau {}
Start med å lage en fil som beskrevet.
Du må finne ut av følgende:
- Hvordan laste inn en fil.
- Lese alle linjene i fila.
- Separere verdiene på hver linje og konvertere de fra String til int.
- legge sammen alle verdier per id.
med fruktkjøtt.
Tias's Avatar
Crew
Sitat av snuskatten Vis innlegg
Du må finne ut av følgende:
- Hvordan laste inn en fil.
- Lese alle linjene i fila.
- Separere verdiene på hver linje og konvertere de fra String til int.
- legge sammen alle verdier per id.
Vis hele sitatet...
Snuskatten har riktig tilnærming her. Det hele handler om å dele opp problemet i mindre deler, og så løse et og et problem.

Jeg ville begynt med å lage en fil med en main-metode, og så forsøkt å finne ut hvordan jeg kan lese inn en tekststreng fra en fil. Så bygger du videre på det, og omstrukturerer og rydder etterhvert som programmet tar form.
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();
    }
}