Created
August 25, 2010 09:39
-
-
Save jraregris/549187 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import easyIO.*; | |
import org.joda.time.*; | |
import java.util.*; | |
public class Oblig4 { | |
/** | |
* @param args | |
* | |
* Sjekker parametere, starter opp ordreløkka etter at filene er lest via konstruktørene til «MetInst». | |
*/ | |
public static void main(String[] args) { | |
if(args.length >= 2){ | |
MetInst m = new MetInst(args[0],args[1]); | |
m.ordreloekke(); | |
} | |
else{ | |
System.out.println("SHIT!: Du må oppgi to parametere!"); | |
} | |
} | |
} | |
class MetInst { | |
Out skjerm = new Out(); | |
In tast = new In(); | |
/** To hashmaps til å lagre pekere til de samme stasjonene */ | |
HashMap <Integer, Stasjon> stasjonerEtterNummer = new HashMap<Integer, Stasjon>(); | |
HashMap <String, Stasjon> stasjonerEtterNavn = new HashMap<String, Stasjon>(); | |
MetInst(String stasjonsfil, String veardatafil) { | |
/** Last inn værstasjoner fra filen */ | |
In f = new In(stasjonsfil); | |
lastStasjonerFraFil(f); | |
/** Last inn værdata fra filen */ | |
f = new In(veardatafil); | |
lastVeardataFraFil(f); | |
} | |
private void lastVeardataFraFil(In f) { | |
while(f.hasNext()){ | |
/** Lese data fra fil */ | |
int stasjonsnummer = f.inInt(); | |
int dag = f.inInt(); | |
int maaned = f.inInt(); | |
double maxVind = f.inDouble(); | |
double nedboer = f.inDouble(); | |
double minTemp = f.inDouble(); | |
double maxTemp = f.inDouble(); | |
/** Lage nytt dato-objekt */ | |
DateTime d = new DateTime(2003, maaned, dag, 0, 0, 0, 0); | |
/** Lage nytt maaling-objekt */ | |
Maaling m = new Maaling(d, maxVind, nedboer, minTemp, maxTemp); | |
/** Hente riktig stasjon */ | |
Stasjon s = stasjonerEtterNummer.get(stasjonsnummer); | |
/** putte riktig maaling inn i riktig stasjons maalinger med dato-objektet som nøkkel */ | |
s.leggTilMaaling(m.dato, m); | |
} | |
} | |
private void lastStasjonerFraFil(In f) { | |
In fylkefil = new In("fylker.txt"); | |
HashMap <String, Character> fylker = hentFylker(fylkefil); | |
while(f.hasNext()){ | |
/** Leser data fra filen */ | |
int stasjonsnummer = f.inInt(); | |
String navn = f.inWord(); | |
int meterOverHavet = f.inInt(); | |
String kommune = f.inWord(); | |
String fylke = f.inWord(); | |
char landsdel = fylker.get(fylke); | |
/** Oppretter stasjon */ | |
Stasjon s = new Stasjon(stasjonsnummer, navn, meterOverHavet, kommune, fylke, landsdel); | |
/** Smelle stasjonen inn i de to HasMapsene våre */ | |
stasjonerEtterNummer.put(s.stasjonsnummer, s); | |
stasjonerEtterNavn.put(s.navn, s); | |
} | |
} | |
private HashMap<String, Character> hentFylker(In f) { | |
HashMap <String, Character> fylker = new HashMap<String, Character>(); | |
String n = new String(); | |
char c; | |
while(f.hasNext()){ | |
n = f.inWord(); | |
f.skipWhite(); | |
c = f.inChar(); | |
fylker.put(n, c); | |
} | |
return fylker; | |
} | |
public void ordreloekke() { | |
int løkkeStatus = -1; | |
while (løkkeStatus != 4) { // Skriver ut løkken med mindre | |
// løkkestatusen er 8 | |
skjerm.outln(" 1 - Finn antall uværsdager"); | |
skjerm.outln(" 2 - Sammenlign regn ved kyststasjoner mot resten"); | |
skjerm.outln(" 3 - Sammenlign landsdeler"); | |
skjerm.outln(" 4 - avslutt"); | |
// try { | |
løkkeStatus = velgFraMeny(tast.inInt()); | |
// } catch (RuntimeException e) { | |
// // Fang alle feil og skriv ut en feilmelding og prøv igjen | |
// skjerm.outln("Det skjedde en forferdelig feil: " + e.getMessage()); | |
// } | |
} | |
skjerm.outln("\n Adjø!"); | |
} | |
private int velgFraMeny(int valg) { | |
switch (valg) { | |
case 1: | |
finnAntallUvaersdager(); | |
break; | |
case 2: | |
sammenlignRegnVedKystenMotResten(); | |
break; | |
case 3: | |
sammenlignLandsdeler(); | |
break; | |
case 4: | |
return 4; | |
default: | |
skjerm.outln("Feil kommando!"); | |
break; | |
} | |
return -1; | |
} | |
private void sammenlignLandsdeler() { | |
skjerm.outln("Skriv måned: "); | |
int maaned = tast.inInt(); | |
sammenlignLandsdeler(maaned); | |
} | |
private void sammenlignLandsdeler(int maaned) { | |
HashMap <Character, Landsdel> l = new HashMap<Character, Landsdel>(); | |
populerLandsdeler(l); | |
for(Stasjon s : stasjonerEtterNavn.values()){ | |
if(s.harMaalingIMaaned(maaned)){ | |
l.get(s.landsdel).antallStasjoner++; | |
l.get(s.landsdel).temperatur += s.hentMaanedligGjennomsTemp(maaned); | |
l.get(s.landsdel).nedboer += s.hentMeenedligGjennomsNedboer(maaned); | |
} | |
} | |
for(Landsdel la : l.values()){ | |
Out fil = new Out("Resultater.txt", true); | |
double temp = la.hentGjennomsnittsTemp(); | |
double nedboer = la.hentGjennomsnittsNedboer(); | |
fil.out(la.navn, 10); | |
fil.out(" i måned "); | |
fil.out(maaned, 3, Out.RIGHT); | |
fil.out(" Temperatur: "); | |
fil.out(Format.align(temp, 6, 2)); | |
fil.out(", Nedbør: "); | |
fil.outln(Format.align(nedboer, 4, 1)); | |
fil.close(); | |
skjerm.outln("Skrevet til fil!"); | |
} | |
} | |
private void populerLandsdeler(HashMap<Character, Landsdel> landsdeler) { | |
landsdeler.put('Ø', new Landsdel("Østlandet")); | |
landsdeler.put('V', new Landsdel("Vestlandet")); | |
landsdeler.put('S', new Landsdel("Sørlandet")); | |
landsdeler.put('M', new Landsdel("Midt-Norge")); | |
landsdeler.put('N', new Landsdel("Nord-Norge")); | |
landsdeler.put('U', new Landsdel("Ut-Norge")); | |
} | |
private void sammenlignRegnVedKystenMotResten() { | |
int antallKyststasjoner = 0; | |
int antallInnlandsstasjoner = 0; | |
double kystregn = 0; | |
double innlandsregn = 0; | |
for(Stasjon s : stasjonerEtterNavn.values()){ | |
if(s.meterOverHavet < 60){ | |
for(Maaling m : s.maalinger.values()) { | |
if(m.nedboer != -99){ | |
antallKyststasjoner++; | |
kystregn += m.nedboer; | |
} | |
} | |
} else { | |
for(Maaling m : s.maalinger.values()) { | |
if(m.nedboer != -99){ | |
antallInnlandsstasjoner++; | |
innlandsregn += m.nedboer; | |
} | |
} | |
} | |
} | |
double kystgjennomsnitt = kystregn/antallKyststasjoner; | |
double innlandsgjennomsnitt = innlandsregn/antallInnlandsstasjoner; | |
if(kystgjennomsnitt > innlandsgjennomsnitt){ | |
skjerm.outln("Det er sant, det regner mer på kysten enn på innlandet! (" + kystgjennomsnitt + "mm per døgn i gjennomsnitt over " + innlandsgjennomsnitt + "mm)"); | |
} | |
} | |
private void finnAntallUvaersdager() { | |
// Velg stasjon | |
skjerm.out("Skriv stasjonsnavn: "); | |
String navn = tast.inWord().toUpperCase(); | |
skjerm.outln(); //Ekstra linjeskift | |
if(erEntydigStasjon(navn)){ | |
Stasjon s = entydigStasjon(navn); | |
skjerm.out("Skriv måned: "); | |
int maaned = tast.inInt(); | |
if(s.harMaalingIMaaned(maaned)){ | |
skjerm.outln("Antall uværsdager på " + s.navn + " i måned " + maaned + ": " + s.antallUvaersdager(maaned)); | |
} else { | |
skjerm.outln(s.navn + " har ingen registrerte målinger i måned " + maaned); | |
} | |
} else if (erIStasjoner(navn)){ | |
skjerm.outln("Stasjonsnavnet du oppga (" + navn + ") passer til disse ("+ erIStasjonerListeAntall(navn) + ") stasjonene:"); | |
skjerm.outln(erIStasjonerListe(navn)); | |
} else { | |
skjerm.outln("FEIL: Stasjonsnavnet du oppga (" + navn + ") er ikke en registrert stasjon!"); | |
} | |
skjerm.outln(); //Ekstra linjeskift | |
} | |
private Stasjon entydigStasjon(String navn) { | |
if(erEntydigStasjon(navn)){ | |
for(String s : stasjonerEtterNavn.keySet()){ | |
if(s.contains(navn)) { | |
return stasjonerEtterNavn.get(s); | |
} | |
} | |
} | |
return null; | |
} | |
private int erIStasjonerListeAntall(String navn) { | |
int returInt = 0; | |
for(String s: stasjonerEtterNavn.keySet()) { | |
if(s.contains(navn)) { | |
returInt++; | |
} | |
} | |
return returInt; | |
} | |
private String erIStasjonerListe(String navn) { | |
int i = 0; | |
String returstreng = new String(""); | |
for (String s : stasjonerEtterNavn.keySet()) { | |
if(s.contains(navn)){ | |
if(i == 0){ | |
returstreng = s; | |
} else if (i % 5 == 0) { | |
returstreng = returstreng + ",\n" + s; | |
} else { | |
returstreng = returstreng + ", " + s; | |
} | |
i++; | |
} | |
} | |
returstreng = returstreng + "!"; | |
return returstreng; | |
} | |
private boolean erIStasjoner(String navn) { | |
for (String s : stasjonerEtterNavn.keySet()) { | |
if(s.contains(navn)){ | |
return true; | |
} | |
} | |
return false; | |
} | |
private boolean erEntydigStasjon(String navn) { | |
if(erIStasjonerListeAntall(navn) == 1){ | |
return true; | |
} | |
return false; | |
} | |
} | |
class Stasjon { | |
char landsdel; | |
int stasjonsnummer; | |
String navn = new String(); | |
int meterOverHavet; | |
Kommune kommune = new Kommune(); | |
Fylke fylke = new Fylke(); | |
HashMap <DateTime, Maaling> maalinger = new HashMap<DateTime, Maaling>(); | |
public Stasjon(int stasjonsnummer, String navn, int meterOverHavet, String kommune, String fylke, char landsdel) { | |
this.stasjonsnummer = stasjonsnummer; | |
this.navn = navn; | |
this.meterOverHavet = meterOverHavet; | |
this.landsdel = landsdel; | |
// TODO: this.kommune = new Kommune(kommune); | |
// TODO: this.fylke = new Fylke(fylke); | |
} | |
public void leggTilMaaling(DateTime d, Maaling m) { | |
maalinger.put(d, m); | |
} | |
public boolean harMaalingIMaaned(int maaned) { | |
for(DateTime d : maalinger.keySet()){ | |
if(d.getMonthOfYear() == maaned){ | |
return true; | |
} | |
} | |
return false; | |
} | |
public int antallUvaersdager(int maaned) { | |
int i = 0; | |
for(DateTime d: maalinger.keySet()){ | |
if(d.getMonthOfYear() == maaned){ | |
if(maalinger.get(d).erDetUvaer()){ | |
i++; | |
} | |
} | |
} | |
return i; | |
} | |
public double hentMaanedligGjennomsTemp(int maaned) { | |
int i = 0; | |
double temp = 0; | |
for(DateTime d: maalinger.keySet()){ | |
if(d.getMonthOfYear() == maaned){ | |
double j = maalinger.get(d).hentGjennomsnittsTemp(); | |
if(j != -99){ | |
temp += j; | |
i++; | |
} | |
} | |
} | |
temp = temp/i; | |
return temp; | |
} | |
public double hentMeenedligGjennomsNedboer(int maaned) { | |
int i = 0; | |
double nedboer = 0; | |
for(DateTime d: maalinger.keySet()) { | |
if(d.getMonthOfYear() == maaned){ | |
double j = maalinger.get(d).nedboer; | |
if(j != -99){ | |
nedboer += j; | |
i++; | |
} | |
} | |
} | |
nedboer = nedboer/i; | |
return nedboer; | |
} | |
} | |
class Maaling { | |
class Landsdel { | |
double temperatur; | |
double nedboer; | |
int antallStasjoner; | |
String navn = new String(); | |
public Landsdel(String navn) { | |
this.navn = navn; | |
temperatur = 0; | |
nedboer = 0; | |
antallStasjoner = 0; | |
} | |
public double hentGjennomsnittsTemp() { | |
return temperatur/antallStasjoner; | |
} | |
public double hentGjennomsnittsNedboer() { | |
return nedboer/antallStasjoner; | |
} | |
} | |
double maxVind; | |
double nedboer; | |
double minTemp; | |
double maxTemp; | |
DateTime dato = new DateTime(); | |
public Maaling(DateTime dato, double maxVind, double nedboer, double minTemp, double maxTemp) { | |
this.dato = dato; | |
this.maxVind = maxVind; | |
this.nedboer = nedboer; | |
this.minTemp = minTemp; | |
this.maxTemp = maxTemp; | |
} | |
public boolean erDetUvaer() { | |
if((nedboer + maxVind) >= 10.7 ){ | |
return true; | |
} | |
return false; | |
} | |
public double hentGjennomsnittsTemp() { | |
double gjennomsnittsTemp = minTemp * maxTemp / 2.0; | |
return gjennomsnittsTemp; | |
} | |
} | |
class Landsdel { | |
double temperatur; | |
double nedboer; | |
int antallStasjoner; | |
String navn = new String(); | |
public Landsdel(String navn) { | |
this.navn = navn; | |
temperatur = 0; | |
nedboer = 0; | |
antallStasjoner = 0; | |
} | |
public double hentGjennomsnittsTemp() { | |
return temperatur/antallStasjoner; | |
} | |
public double hentGjennomsnittsNedboer() { | |
return nedboer/antallStasjoner; | |
} | |
} | |
class Fylke { | |
} | |
class Kommune { | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment