com.git.ifly6.components.Census.java Source code

Java tutorial

Introduction

Here is the source code for com.git.ifly6.components.Census.java

Source

/* Copyright (c) 2015 ifly6
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */

package com.git.ifly6.components;

import java.io.IOException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

import org.apache.commons.lang3.StringUtils;

import com.git.ifly6.components.NSObjects.NSNation;
import com.git.ifly6.components.NSObjects.NSRegion;

public class Census {

    static double waitTime = 1.716;
    static NSRegion region;

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        try {
            region = new NSRegion(args[0]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.print("Please input the name of your region: \t");
            region = new NSRegion(scan.nextLine());
        }

        try {

            HashMap<String, Integer> endoMap = new HashMap<String, Integer>();
            String[] waMembers = region.getWAMembers();
            int[] valueCount = new int[waMembers.length];

            System.out.println(
                    "[INFO] This census will take: " + time((int) Math.round(waitTime * waMembers.length)));

            for (int i = 0; i < waMembers.length; i++) {
                NSNation nation = new NSNation(waMembers[i]);
                valueCount[i] = nation.getEndoCount();
                endoMap.put(waMembers[i], new Integer(valueCount[i]));

                System.out.println("[LOG] Fetched information for: " + waMembers[i] + ", " + (i + 1) + " of "
                        + waMembers.length);
            }

            TreeMap<String, Integer> sortedMap = sortByValue(endoMap);

            int current = 0;
            int previous = sortedMap.firstEntry().getValue();

            System.out.printf("%-35s %12s %12s%n", "Nations", "Endorsements", "Difference");
            System.out.println("-------------------------------------------------------------");

            for (Map.Entry<String, Integer> entry : sortedMap.entrySet()) {

                String nationName = StringUtils.capitalize(entry.getKey().replace('_', ' '));
                current = entry.getValue();

                if ((previous - current) != 0) {
                    System.out.printf("%-35s %12s %12s%n", nationName, entry.getValue(), (previous - current));
                } else {
                    System.out.printf("%-35s %12s %12s%n", nationName, entry.getValue(), "-");
                }

                previous = entry.getValue();
            }

            System.out.println("-------------------------------------------------------------");
            System.out.printf("%-35s %12s %12s%n", "Delegate", "Endorsements", "Proportion");
            System.out.printf("%-35s %12s %12s%n",
                    StringUtils.capitalize(sortedMap.firstEntry().getKey().replace('_', ' ')),
                    sortedMap.firstEntry().getValue(),
                    (double) (sortedMap.firstEntry().getValue() / waMembers.length));

        } catch (IOException e) {
            printError("Failed to fetch WA members or get endorsements in this region. "
                    + "Check your internet connection or the state of the API.");
        }

        scan.close();
    }

    private static TreeMap<String, Integer> sortByValue(HashMap<String, Integer> map) {
        ValueComparator vc = new ValueComparator(map);
        TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(vc);
        sortedMap.putAll(map);
        return sortedMap;
    }

    private static String time(int seconds) {
        int minutes = seconds / 60;
        seconds -= minutes * 60;
        int hours = minutes / 60;
        minutes -= hours * 60;
        int days = hours / 24;
        hours -= days * 24;
        return days + "d:" + hours + "h:" + minutes + "m:" + seconds + "s";
    }

    private static void printError(final String message) {
        System.out.println("[ERROR] " + message);
    }
}

class ValueComparator implements Comparator<String> {

    Map<String, Integer> map;

    public ValueComparator(Map<String, Integer> base) {
        this.map = base;
    }

    @Override
    public int compare(String a, String b) {
        if (map.get(a) >= map.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}