Skip to content

Instantly share code, notes, and snippets.

@jraregris
Created August 25, 2010 09:39
Show Gist options
  • Save jraregris/549187 to your computer and use it in GitHub Desktop.
Save jraregris/549187 to your computer and use it in GitHub Desktop.
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