Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package CityDivision;
- import CityDivision.City.CityXComparator;
- import CityDivision.City.CityYComparator;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileReader;
- import java.io.IOException;
- import static java.lang.Math.floor;
- import java.util.ArrayList;
- import java.util.Collections;
- /**
- *
- * @author Varden
- */
- public class CityDivider {
- int numberOfCitiesInGroup;
- City warehouse;
- ArrayList<City> cities = new ArrayList();
- ArrayList<ArrayList<City>> dividedCities = new ArrayList();
- public int getNumberOfCitiesInGroup() {
- return numberOfCitiesInGroup;
- }
- public ArrayList<City> getCities() {
- return cities;
- }
- public ArrayList<ArrayList<City>> getDividedCities() {
- return dividedCities;
- }
- private void recurrenceDivision(ArrayList<City> cities, int numberOfCitiesInGroup) {
- if (cities.size() <= numberOfCitiesInGroup) {
- dividedCities.add(cities);
- } else {
- int minX, maxX, minY, maxY;
- minX = cities.get(0).x;
- maxX = cities.get(0).x;
- minY = cities.get(0).y;
- maxY = cities.get(0).y;
- for (City city : cities) {
- if (city.x < minX) {
- minX = city.x;
- } else if (city.x > maxX) {
- maxX = city.x;
- }
- if (city.y < minY) {
- minY = city.y;
- } else if (city.y > maxY) {
- maxY = city.y;
- }
- }
- int spanX = maxX - minX;
- int spanY = maxY - minY;
- if (spanX > spanY) {
- Collections.sort(cities, new CityXComparator());
- } else {
- Collections.sort(cities, new CityYComparator());
- }
- int remainder = cities.size() % numberOfCitiesInGroup;
- int numberOfGroups = (cities.size() - remainder) / numberOfCitiesInGroup;
- if (remainder != 0) {
- numberOfGroups++;
- }
- ArrayList<City> part1 = new ArrayList();
- ArrayList<City> part2 = new ArrayList();
- int i = 0;
- for (City city : cities) {
- if (i < floor(numberOfGroups / 2) * numberOfCitiesInGroup) {
- part1.add(city);
- } else {
- part2.add(city);
- }
- i++;
- }
- recurrenceDivision(part1, numberOfCitiesInGroup);
- recurrenceDivision(part2, numberOfCitiesInGroup);
- }
- }
- public void divideCitiesToGroups() {
- recurrenceDivision(cities, numberOfCitiesInGroup);
- addWarehouseToGroups();
- }
- public void loadDataFromTextFile(String filePath) {
- try {
- File file = new File(filePath);
- FileReader fileReader = new FileReader(file);
- BufferedReader bufferedReader = new BufferedReader(fileReader);
- StringBuffer stringBuffer = new StringBuffer();
- String line;
- //pobierz k
- if ((line = bufferedReader.readLine()) != null) {
- numberOfCitiesInGroup = Integer.parseInt(line);
- }
- //pobierz magazyn
- if ((line = bufferedReader.readLine()) != null) {
- String[] coordinates = line.split(" ");
- warehouse = new City(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]));
- }
- //pobierz pozostałe miasta
- while ((line = bufferedReader.readLine()) != null) {
- String[] coordinates = line.split(" ");
- City city = new City(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]));
- cities.add(city);
- }
- fileReader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void printGroups() {
- System.out.println("Warehouse: ");
- System.out.print(warehouse.x);
- System.out.print("\t");
- System.out.println(warehouse.y);
- System.out.println();
- for (ArrayList<City> cityGroup : dividedCities) {
- for (City city : cityGroup) {
- System.out.print(city.x);
- System.out.print("\t");
- System.out.println(city.y);
- }
- System.out.println();
- }
- }
- private void addWarehouseToGroups() {
- for (ArrayList<City> cityGroup : dividedCities) {
- //add warehouse at the end of each group
- cityGroup.add(cityGroup.size(), warehouse);
- //add warehouse at the beginning of each group
- cityGroup.add(0, warehouse);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement