From d713ced011dc57c7b46980ee97f16993659bdee6 Mon Sep 17 00:00:00 2001 From: Marc Siegel Date: Wed, 16 May 2012 11:34:45 -0400 Subject: [PATCH] Mike/Marc/Chris: FootballMunging is done using tupled return type, one down, one to go --- .../org/timgroup/dojo/FootballMunging.java | 55 +++++++++++++------ .../timgroup/dojo/FootballMungingTest.java | 54 ++++++++++++------ 2 files changed, 76 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/timgroup/dojo/FootballMunging.java b/src/main/java/org/timgroup/dojo/FootballMunging.java index 8238b85..ae65920 100755 --- a/src/main/java/org/timgroup/dojo/FootballMunging.java +++ b/src/main/java/org/timgroup/dojo/FootballMunging.java @@ -1,16 +1,39 @@ -package org.timgroup.dojo; - -import fj.data.Stream; - -public class FootballMunging { - - private final Stream lines; - - public FootballMunging(Stream lines) { - this.lines = lines; - } - - public String teamWithSmallestDifferenceBetweenForAndAgainst() { - return ""; - } -} +package org.timgroup.dojo; + +import fj.F; +import fj.P2; +import fj.data.Stream; + +import static fj.Ord.intOrd; +import static fj.Ord.stringOrd; +import static fj.Ord.p2Ord; +import static fj.P.p; + +public class FootballMunging { + private final Stream lines; + + public FootballMunging(Stream lines) { + this.lines = lines; + } + + public String teamWithSmallestDifferenceBetweenForAndAgainst() { + return filterLines(lines).map(new F>() { + @Override public P2 f(String s) { + return parseLine(s); + } + }).sort(p2Ord(intOrd, stringOrd)).head()._2(); + } + + public static Stream filterLines(Stream footballLines) { + return footballLines.filter(new F() { + @Override public Boolean f(String s) { + return s.contains(" - "); + } + }); + } + + public static P2 parseLine(String line) { + final String[] fields = line.split("\\s+"); + return p(Math.abs(Integer.valueOf(fields[7]) - Integer.valueOf(fields[9])), fields[2]); + } +} diff --git a/src/test/java/org/timgroup/dojo/FootballMungingTest.java b/src/test/java/org/timgroup/dojo/FootballMungingTest.java index 8184715..48a8008 100755 --- a/src/test/java/org/timgroup/dojo/FootballMungingTest.java +++ b/src/test/java/org/timgroup/dojo/FootballMungingTest.java @@ -1,17 +1,37 @@ -package org.timgroup.dojo; - -import fj.data.Stream; -import org.junit.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static org.timgroup.dojo.Files.readLinesFrom; - -public class FootballMungingTest { - - @Test - public void teamWithSmallestDifferenceBetweenForAndAgainstIsAstonVilla() { - Stream footballLines = readLinesFrom("football.dat"); - assertThat(new FootballMunging(footballLines).teamWithSmallestDifferenceBetweenForAndAgainst(), is("Aston_Villa")); - } -} +package org.timgroup.dojo; + +import fj.P2; +import fj.data.Stream; +import org.junit.Before; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.timgroup.dojo.Files.readLinesFrom; + +public class FootballMungingTest { + private Stream footballLines; + + @Before + public void setup() { + footballLines = readLinesFrom("football.dat"); + } + + @Test + public void teamWithSmallestDifferenceBetweenForAndAgainstIsAstonVilla() { + assertThat(new FootballMunging(footballLines).teamWithSmallestDifferenceBetweenForAndAgainst(), is("Aston_Villa")); + } + + @Test + public void there_are_20_lines_of_football_stats() { + assertThat(FootballMunging.filterLines(footballLines).length(), is(20)); + } + + @Test + public void parses_relevant_info_out_of_a_line() { + final String firstLine = " 1. Arsenal 38 26 9 3 79 - 36 87"; + final P2 arsenal = FootballMunging.parseLine(firstLine); + assertThat(arsenal._1(), is(43)); + assertThat(arsenal._2(), is("Arsenal")); + } +}