├── src ├── main │ ├── TO.DO │ └── java │ │ └── test │ │ ├── Airport.java │ │ ├── Flight.java │ │ └── FlightsInfo.java └── test │ ├── resources │ └── FlightsCodes.txt │ ├── scala │ └── parsers │ │ └── FlightsCsvParserTest.scala │ └── java │ └── com │ └── test │ └── FlightTest.java └── .gitignore /src/main/TO.DO: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/test/resources/FlightsCodes.txt: -------------------------------------------------------------------------------- 1 | "YEAR","QUARTER","MONTH","DAY_OF_MONTH","DAY_OF_WEEK","FL_DATE","ORIGIN","DEST", 2 | 2014,1,1,1,3,2014-01-01,"JFK","LAX", 3 | 2014,1,1,5,7,2014-01-05,"JFK","KBP", 4 | 2014,1,1,6,1,2014-01-06,"KBP","LAX", 5 | 2014,1,1,8,3,2014-01-08,"JFK","LAX", 6 | 2014,1,1,12,7,2014-01-12,"JFK","KBP", 7 | 2014,1,1,13,1,2014-01-13,"KBP","LAX", -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | *.log 3 | 4 | # sbt specific 5 | .cache 6 | .history 7 | .lib/ 8 | dist/* 9 | target/ 10 | lib_managed/ 11 | src_managed/ 12 | project/boot/ 13 | project/plugins/project/ 14 | 15 | # Scala-IDE specific 16 | .scala_dependencies 17 | .worksheet 18 | .idea 19 | .classpath 20 | .cache-main 21 | .cache-tests 22 | .project 23 | project 24 | .settings 25 | out/ 26 | /bin/ 27 | -------------------------------------------------------------------------------- /src/main/java/test/Airport.java: -------------------------------------------------------------------------------- 1 | package test; 2 | 3 | public class Airport { 4 | private String name; 5 | private int totalNumberOfPlanes; 6 | 7 | public String getName() { 8 | return name; 9 | } 10 | 11 | public void setName(String name) { 12 | this.name = name; 13 | } 14 | 15 | public int getTotalNumberOfPlanes() { 16 | return totalNumberOfPlanes; 17 | } 18 | 19 | public void setTotalNumberOfPlanes(int totalNumberOfPlanes) { 20 | this.totalNumberOfPlanes = totalNumberOfPlanes; 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /src/test/scala/parsers/FlightsCsvParserTest.scala: -------------------------------------------------------------------------------- 1 | package parsers 2 | 3 | import javax.annotation.Resources 4 | 5 | import test.FlightsInfo 6 | import test.Flight 7 | import org.specs2.mutable.SpecificationWithJUnit 8 | import org.specs2.specification.Scope 9 | import scala.collection.JavaConversions._ 10 | 11 | 12 | class FlightsCsvParserTest extends SpecificationWithJUnit { 13 | "Parse" should { 14 | 15 | "return the expected result" in new FlightsCsvParserTestContext { 16 | // val expected = List[Flight] 17 | // ( 18 | // new Flight(2014,1,1,1,3,"2014-01-01","JFK","LAX"), 19 | // new Flight(2014,1,1,2,4,"2014-01-02","JFK","LAX"), 20 | // new Flight(2014,1,1,3,5,"2014-01-03","JFK","LAX") 21 | // ) 22 | // flightsInfoParser.flightsList must be equalTo expected 23 | } 24 | } 25 | 26 | } 27 | 28 | trait FlightsCsvParserTestContext extends Scope { 29 | val filePath = "src/test/resources/FlightsCodes.txt" 30 | val flightsInfoParser = new FlightsInfo() 31 | } -------------------------------------------------------------------------------- /src/test/java/com/test/FlightTest.java: -------------------------------------------------------------------------------- 1 | package com.test; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import java.io.IOException; 6 | import java.util.Arrays; 7 | import java.util.List; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | 12 | import test.Flight; 13 | import test.FlightsInfo; 14 | import static org.hamcrest.CoreMatchers.*; 15 | import org.scalatest.junit.AssertionsForJUnit 16 | 17 | public class FlightTest extends AssertionsForJUnit { 18 | 19 | private FlightsInfo flightsInfo = new FlightsInfo(); 20 | 21 | @Before 22 | public void setUp() throws Exception { 23 | flightsInfo.flightsList(); 24 | } 25 | 26 | @Test 27 | public void test() throws IOException { 28 | assertEquals(1, 5); 29 | List expecteds = Arrays.asList(new Flight(2014, 1, 1, 1, 3, "2014-01-01", 30 | "JFK", "LAX"), new Flight(2014, 1, 1, 2, 4, "2014-01-02", 31 | "JFK", "LAX"), new Flight(2014, 1, 1, 3, 5, "2014-01-03", 32 | "JFK", "LAX")); 33 | 34 | assertThat(flightsInfo.flightsList(), is(expecteds)); 35 | // assertThat(actual, is(not(expected))); 36 | // assertArrayEquals(expecteds, flightsInfo.flightsList()); 37 | } 38 | } -------------------------------------------------------------------------------- /src/main/java/test/Flight.java: -------------------------------------------------------------------------------- 1 | package test; 2 | 3 | public class Flight { 4 | 5 | private int year; 6 | private int quarter; 7 | private int month; 8 | private int dayOfMonth; 9 | private int dayOfWeek; 10 | private String flDate; 11 | private String origin; 12 | private String dest; 13 | 14 | public Flight() { 15 | } 16 | 17 | public Flight(int year, int quarter, int month, int dayOfMonth, 18 | int dayOfWeek, String flDate, String origin, String dest) { 19 | this.year = year; 20 | this.quarter = quarter; 21 | this.month = month; 22 | this.dayOfMonth = dayOfMonth; 23 | this.dayOfWeek = dayOfWeek; 24 | this.flDate = flDate; 25 | this.origin = origin; 26 | this.dest = dest; 27 | } 28 | 29 | public int getYear() { 30 | return year; 31 | } 32 | 33 | public void setYear(int year) { 34 | this.year = year; 35 | } 36 | 37 | public int getQuarter() { 38 | return quarter; 39 | } 40 | 41 | public void setQuarter(int quarter) { 42 | this.quarter = quarter; 43 | } 44 | 45 | public int getMonth() { 46 | return month; 47 | } 48 | 49 | public void setMonth(int month) { 50 | this.month = month; 51 | } 52 | 53 | public int getDayOfMonth() { 54 | return dayOfMonth; 55 | } 56 | 57 | public void setDayOfMonth(int dayOfMonth) { 58 | this.dayOfMonth = dayOfMonth; 59 | } 60 | 61 | public int getDayOfWeek() { 62 | return dayOfWeek; 63 | } 64 | 65 | public void setDayOfWeek(int dayOfWeek) { 66 | this.dayOfWeek = dayOfWeek; 67 | } 68 | 69 | public String getFlDate() { 70 | return flDate; 71 | } 72 | 73 | public void setFlDate(String flDate) { 74 | this.flDate = flDate; 75 | } 76 | 77 | public String getOrigin() { 78 | return origin; 79 | } 80 | 81 | public void setOrigin(String origin) { 82 | this.origin = origin; 83 | } 84 | 85 | public String getDest() { 86 | return dest; 87 | } 88 | 89 | public void setDest(String dest) { 90 | this.dest = dest; 91 | } 92 | 93 | @Override 94 | public int hashCode() { 95 | final int prime = 31; 96 | int result = 1; 97 | result = prime * result + dayOfMonth; 98 | result = prime * result + dayOfWeek; 99 | result = prime * result + ((dest == null) ? 0 : dest.hashCode()); 100 | result = prime * result + ((flDate == null) ? 0 : flDate.hashCode()); 101 | result = prime * result + month; 102 | result = prime * result + ((origin == null) ? 0 : origin.hashCode()); 103 | result = prime * result + quarter; 104 | result = prime * result + year; 105 | return result; 106 | } 107 | 108 | @Override 109 | public boolean equals(Object obj) { 110 | if (this == obj) 111 | return true; 112 | if (obj == null) 113 | return false; 114 | if (getClass() != obj.getClass()) 115 | return false; 116 | Flight other = (Flight) obj; 117 | if (dayOfMonth != other.dayOfMonth) 118 | return false; 119 | if (dayOfWeek != other.dayOfWeek) 120 | return false; 121 | if (dest == null) { 122 | if (other.dest != null) 123 | return false; 124 | } else if (!dest.equals(other.dest)) 125 | return false; 126 | if (flDate == null) { 127 | if (other.flDate != null) 128 | return false; 129 | } else if (!flDate.equals(other.flDate)) 130 | return false; 131 | if (month != other.month) 132 | return false; 133 | if (origin == null) { 134 | if (other.origin != null) 135 | return false; 136 | } else if (!origin.equals(other.origin)) 137 | return false; 138 | if (quarter != other.quarter) 139 | return false; 140 | if (year != other.year) 141 | return false; 142 | return true; 143 | } 144 | 145 | @Override 146 | public String toString() { 147 | return year + ";" + quarter + ";" + month + ";" + dayOfMonth + ";" 148 | + dayOfWeek + ";" + flDate + ";" + origin + ";" + dest; 149 | } 150 | 151 | } -------------------------------------------------------------------------------- /src/main/java/test/FlightsInfo.java: -------------------------------------------------------------------------------- 1 | package test; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.nio.charset.Charset; 6 | import java.text.ParseException; 7 | import java.text.SimpleDateFormat; 8 | import java.util.Calendar; 9 | import java.util.Date; 10 | import java.util.HashMap; 11 | import java.util.LinkedList; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | import org.apache.commons.csv.CSVFormat; 16 | import org.apache.commons.csv.CSVParser; 17 | import org.apache.commons.csv.CSVRecord; 18 | 19 | public class FlightsInfo { 20 | 21 | private static SimpleDateFormat dateFormat = new SimpleDateFormat( 22 | "yyyy-MM-dd"); 23 | private static File csvData = new File( 24 | "src/test/resources/FlightsCodes.txt"); 25 | private static CSVParser parser; 26 | 27 | List flightsList; 28 | 29 | public static void main(String[] args) throws IOException, ParseException { 30 | FlightsInfo flightsInfo = new FlightsInfo(); 31 | flightsInfo.flightsList(); 32 | Map airoportsList = flightsInfo 33 | .getListOfAllAirportsWithTotalNumberOfPlanes("2013-01-01", 34 | "2014-10-10"); 35 | for (String key : airoportsList.keySet()) { 36 | System.out.println("Airport: " + key + " NumberOfPlanes:" 37 | + airoportsList.get(key)); 38 | } 39 | System.out.println("Task 2:"); 40 | Map airoportsListTask2 = flightsInfo 41 | .getDifferenceArrivedAndLeftTotalNumberOfPlanes("LAX", "JFK"); 42 | for (String key : airoportsListTask2.keySet()) { 43 | System.out.println("Airport: " + key + " NumberOfPlanes:" 44 | + airoportsListTask2.get(key)); 45 | } 46 | 47 | System.out.println("Task 3:"); 48 | Map> airoportsListTask3 = flightsInfo 49 | .getDifferenceArrivedAndLeftTotalNumberOfPlanesSumOfPlanesPerEachWeek( 50 | "2013-01-01", "2014-10-10"); 51 | for (String key : airoportsListTask3.keySet()) { 52 | for (String key2 : airoportsListTask3.get(key).keySet()) { 53 | System.out.println("Airport: " + key + " Name:" + key2 54 | + " NumberOfPlanes:" 55 | + airoportsListTask3.get(key).get(key2)); 56 | } 57 | } 58 | 59 | System.out.println("Done"); 60 | } 61 | 62 | private static boolean checkPeriod(String from, String to, String in) 63 | throws ParseException { 64 | if (dateFormat.parse(from).getTime() <= dateFormat.parse(in).getTime() 65 | && dateFormat.parse(to).getTime() >= dateFormat.parse(in) 66 | .getTime()) { 67 | return true; 68 | } 69 | return false; 70 | } 71 | 72 | private static String getWeekNumber(String date) throws ParseException { 73 | Calendar cal = Calendar.getInstance(); 74 | cal.setTime(new Date(dateFormat.parse(date).getTime())); 75 | int week = cal.get(Calendar.WEEK_OF_YEAR); 76 | return "Week" + week; 77 | } 78 | 79 | public List flightsList() throws IOException, ParseException { 80 | List flightsList = new LinkedList<>(); 81 | parser = CSVParser.parse(csvData, Charset.defaultCharset(), 82 | CSVFormat.EXCEL.withHeader()); 83 | for (CSVRecord csvRecord : parser) { 84 | Flight flight = new Flight(); 85 | flight.setYear(Integer.parseInt(csvRecord.get("YEAR"))); 86 | flight.setQuarter(Integer.parseInt(csvRecord.get("QUARTER"))); 87 | flight.setMonth(Integer.parseInt(csvRecord.get("MONTH"))); 88 | flight.setDayOfMonth(Integer.parseInt(csvRecord.get("DAY_OF_MONTH"))); 89 | flight.setDayOfWeek(Integer.parseInt(csvRecord.get("DAY_OF_WEEK"))); 90 | flight.setFlDate(csvRecord.get("FL_DATE")); 91 | flight.setOrigin(csvRecord.get("ORIGIN")); 92 | flight.setDest(csvRecord.get("DEST")); 93 | // System.out.println(flight); 94 | flightsList.add(flight); 95 | } 96 | this.flightsList = flightsList; 97 | return flightsList; 98 | } 99 | 100 | public Map getListOfAllAirportsWithTotalNumberOfPlanes( 101 | String periodFrom, String periodTo) throws ParseException { 102 | HashMap airoportsList = new HashMap(); 103 | for (Flight flight : flightsList) { 104 | if (checkPeriod(periodFrom, periodTo, flight.getFlDate())) { 105 | if (airoportsList.containsKey(flight.getDest())) { 106 | int fligtsCount = airoportsList.get(flight.getDest()); 107 | fligtsCount++; 108 | airoportsList.put(flight.getDest(), fligtsCount); 109 | } else { 110 | airoportsList.put(flight.getDest(), 1); 111 | } 112 | } 113 | } 114 | return airoportsList; 115 | } 116 | 117 | public Map getDifferenceArrivedAndLeftTotalNumberOfPlanes( 118 | String arrivedAirport, String leftAirport) { 119 | HashMap airoportsList = new HashMap(); 120 | for (Flight flight : flightsList) { 121 | if (flight.getDest().equals(arrivedAirport)) { 122 | if (airoportsList.containsKey(arrivedAirport)) { 123 | int fligtsCount = airoportsList.get(arrivedAirport); 124 | fligtsCount++; 125 | airoportsList.put(arrivedAirport, fligtsCount); 126 | } else { 127 | airoportsList.put(arrivedAirport, 1); 128 | } 129 | } 130 | if (flight.getOrigin().equals(leftAirport)) { 131 | if (airoportsList.containsKey(leftAirport)) { 132 | int fligtsCount = airoportsList.get(leftAirport); 133 | fligtsCount--; 134 | airoportsList.put(leftAirport, fligtsCount); 135 | } else { 136 | airoportsList.put(leftAirport, -1); 137 | } 138 | } 139 | } 140 | return airoportsList; 141 | } 142 | 143 | public Map> getDifferenceArrivedAndLeftTotalNumberOfPlanesSumOfPlanesPerEachWeek( 144 | String periodFrom, String periodTo) throws ParseException { 145 | HashMap> weeksList = new HashMap>(); 146 | for (Flight flight : flightsList) { 147 | if (checkPeriod(periodFrom, periodTo, flight.getFlDate())) { 148 | if (weeksList.containsKey(getWeekNumber(flight.getFlDate()))) { 149 | HashMap airoport = weeksList 150 | .get(getWeekNumber(flight.getFlDate())); 151 | if (airoport != null && flight != null) { 152 | Integer fligtsCount = airoport.get(flight.getDest()); 153 | if (fligtsCount == null) { 154 | fligtsCount = 0; 155 | } 156 | fligtsCount++; 157 | airoport.put(flight.getDest(), fligtsCount); 158 | weeksList.put(getWeekNumber(flight.getFlDate()), 159 | airoport); 160 | } 161 | } else { 162 | HashMap airoportList = new HashMap(); 163 | airoportList.put(flight.getDest(), 1); 164 | weeksList.put(getWeekNumber(flight.getFlDate()), 165 | airoportList); 166 | } 167 | } 168 | } 169 | return weeksList; 170 | } 171 | } --------------------------------------------------------------------------------