You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
6.2 KiB

package seng202.group9.GUI;
import javafx.fxml.FXML;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Alert;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import seng202.group9.Controller.Dataset;
import seng202.group9.Controller.SceneCode;
import seng202.group9.Controller.Session;
import seng202.group9.Core.Airline;
import seng202.group9.Core.Route;
import java.util.*;
import static javafx.application.ConditionalFeature.FXML;
/**
* Created by fwy13 on 2/10/2016.
*/
public class AirlineGraphController extends Controller{
private Dataset dataset;
private Session session;
private LinkedHashMap<String, Airline> airlineDict;
private HashMap<Integer, String> sessionDict;
Airline[] airlinesFiltered;
@FXML
private BarChart routeGraph;
@FXML
private CategoryAxis routeXAxis;
@FXML
private BarChart countryGraph;
@FXML
private CategoryAxis countryXAxis;
@FXML
private BarChart equipGraph;
@FXML
private CategoryAxis equipXAxis;
@Override
public void load() {
if (!checkDataset()){
return;
}
dataset = getParent().getCurrentDataset();
airlineDict = dataset.getAirlineDictionary();
session = getParent().getSession();
sessionDict = session.getFilteredAirlines();
if (sessionDict.size() == 0){
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("No Data");
alert.setHeaderText("No Filtered Data");
alert.setContentText("There is no set Filtered Data Please go to the Airline Raw Data and Filter a Dataset to Analyse.");
alert.showAndWait();
}
ArrayList<Airline> airlinesArrayList = new ArrayList<>();
for (int key : sessionDict.keySet()) {
airlinesArrayList.add(airlineDict.get(sessionDict.get(key)));
}
airlinesFiltered = airlinesArrayList.toArray(new Airline[airlinesArrayList.size()]);
loadRoutesGraph();
loadCountryGraph();
loadEquipGraph();
}
public void loadRoutesGraph(){
routeGraph.setTitle("Top 10 Number of Routes vs Airports");
routeXAxis.setLabel("Airports");
XYChart.Series<String,Integer> series = new XYChart.Series<>();
series.setName("Number of Routes");
ArrayList<Airline> airlines = new ArrayList<>();
airlines.addAll(Arrays.asList(airlinesFiltered));
Airline maxRoutes[] = new Airline[10];
for (int i = 0 ; i < maxRoutes.length; i ++) {
int max = 0;
Airline maxAirline = null;
for (Airline airline: airlines){
if (airline != null) {
if (airline.getRoutes().size() > max) {
maxAirline = airline;
max = airline.getRoutes().size();
}
}
}
maxRoutes[i] = maxAirline;
airlines.remove(maxAirline);
}
for (int i = 0; i < maxRoutes.length; i++){
if (maxRoutes[i] != null) {
series.getData().add(new XYChart.Data<String, Integer>(maxRoutes[i].getName(), maxRoutes[i].getRoutes().size()));
}
}
routeGraph.getData().add(series);
}
public void loadCountryGraph(){
countryGraph.setTitle("Top 10 Countries with the most Airlines");
countryXAxis.setLabel("Countries");
XYChart.Series<String,Integer> series = new XYChart.Series<>();
series.setName("Number of Countries");
HashMap<String, Integer> countries = new HashMap<>();
for (Airline airline: airlinesFiltered){
if (countries.containsKey(airline.getCountryName())) {
countries.put(airline.getCountryName(), countries.get(airline.getCountryName()) + 1);
}else{
countries.put(airline.getCountryName(), 1);
}
}
int length = 10;
if (countries.size() < 10){
length = countries.size();
}
for (int i = 0 ; i < length; i ++) {
int max = 0;
String maxCountry = null;
for (String country: countries.keySet()){
if (countries.get(country) > max){
maxCountry = country;
max = countries.get(country);
}
}
series.getData().add(new XYChart.Data<String, Integer>(maxCountry, max));
countries.remove(maxCountry);
}
countryGraph.getData().add(series);
}
public void loadEquipGraph(){
equipGraph.setTitle("Top 10 Equipment used by Airlines");
equipXAxis.setLabel("Equipment");
XYChart.Series<String,Integer> series = new XYChart.Series<>();
series.setName("Number of Equipment");
HashMap<String, Integer> equipmentList = new HashMap<>();//equipment, count
for (Airline airline: airlinesFiltered){
for (Route route: airline.getRoutes()){
String equipment[] = route.getEquipment().split(" ");
for (String equip : equipment){
if (equipmentList.containsKey(equip)){
equipmentList.put(equip, equipmentList.get(equip) + 1);
}else{
equipmentList.put(equip, 1);
}
}
}
}
int length = 10;
if (equipmentList.size() < 10){
length = equipmentList.size();
}
for (int i = 0 ; i < length; i ++) {
int max = 0;
String maxEquip = "";
for (String equip: equipmentList.keySet()){
if (equipmentList.get(equip) > max){
max = equipmentList.get(equip);
maxEquip = equip;
}
}
series.getData().add(new XYChart.Data<String, Integer>(maxEquip, max));
equipmentList.remove(maxEquip);
}
equipGraph.getData().add(series);
}
public void goToRawData(){
replaceSceneContent(SceneCode.AIRLINE_RAW_DATA);
}
}