2014-04-09 16:55:21 -05:00
|
|
|
import java.lang.Math;
|
2014-04-10 12:12:59 -05:00
|
|
|
import java.util.Arrays;
|
2014-04-08 20:58:02 -05:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Nicolás A. Ortega
|
|
|
|
* @copyright (C) Nicolás A. Ortega
|
|
|
|
* @license GNU General Public License 3.0 (GPLv3)
|
|
|
|
* @year 2014
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public class MMMCalc {
|
2014-04-09 16:17:15 -05:00
|
|
|
private static boolean verbose = false;
|
2014-04-08 20:58:02 -05:00
|
|
|
private static float[] numArray;
|
2014-04-09 16:55:21 -05:00
|
|
|
private static float mean = 0;
|
2014-04-14 12:02:36 -05:00
|
|
|
private static float q1 = 0;
|
2014-04-09 16:55:21 -05:00
|
|
|
private static float median = 0;
|
2014-04-14 12:02:36 -05:00
|
|
|
private static float q3 = 0;
|
2014-04-09 16:55:21 -05:00
|
|
|
private static float mode = 0;
|
|
|
|
private static float range = 0;
|
|
|
|
private static float stdDev = 0;
|
2014-04-10 16:32:16 -05:00
|
|
|
private static float variance = 0;
|
2014-04-08 20:58:02 -05:00
|
|
|
|
|
|
|
public static void main(String[] args) {
|
2014-04-09 17:22:39 -05:00
|
|
|
System.out.println("MMMCalc v0.2, Copyright (C) 2014 Nicolás A. Ortega\n" +
|
|
|
|
"This program comes with ABSOLUTELY NO WARRANTY; for details use '-w'\n" +
|
|
|
|
"This is free software, and you are welcome to redistribute it\n" +
|
|
|
|
"under certain conditions; use '-c' for details.\n");
|
2014-04-08 20:58:02 -05:00
|
|
|
if(args.length > 0) {
|
2014-04-08 22:02:56 -05:00
|
|
|
if(args[0].equals("-h")) {
|
|
|
|
System.out.println("Usage:\n" +
|
|
|
|
" MMMCalc [options] [variables]\n\n" +
|
|
|
|
"Options:\n" +
|
2014-04-09 17:22:39 -05:00
|
|
|
" -v | -V -- Be verbose (show the work).\n" +
|
2014-04-09 17:25:00 -05:00
|
|
|
" -w -- Show warranty information.\n" +
|
|
|
|
" -c -- Show copyright information.\n" +
|
2014-04-09 17:22:39 -05:00
|
|
|
" -h -- Show this help information.\n");
|
|
|
|
} else if(args[0].equals("-w")) {
|
|
|
|
System.out.println("THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\n" +
|
|
|
|
"APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\n" +
|
|
|
|
"HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM 'AS IS' WITHOUT WARRANTY\n" +
|
|
|
|
"OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\n" +
|
|
|
|
"THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n" +
|
|
|
|
"PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\n" +
|
|
|
|
"IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\n" +
|
|
|
|
"ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n");
|
|
|
|
} else if(args[0].equals("-c")) {
|
|
|
|
System.out.println("MMMCalc, a very basic statistics calculator.\n" +
|
|
|
|
"Copyright (C) 2014 Nicolás A. Ortega\n\n" +
|
|
|
|
"This program is free software: you can redistribute it and/or modify\n" +
|
|
|
|
"it under the terms of the GNU General Public License as published by\n" +
|
|
|
|
"the Free Software Foundation, either version 3 of the License, or\n" +
|
|
|
|
"(at your option) any later version.\n\n" +
|
|
|
|
"This program is distributed in the hope that it will be useful,\n" +
|
|
|
|
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +
|
|
|
|
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +
|
|
|
|
"GNU General Public License for more details.\n\n" +
|
|
|
|
"You should have received a copy of the GNU General Public License\n" +
|
|
|
|
"along with this program. If not, see <www.gnu.org/licenses/>.");
|
2014-04-09 11:59:26 -05:00
|
|
|
} else if(args[0].equals("-v") || args[0].equals("-V")) {
|
2014-04-09 16:17:15 -05:00
|
|
|
verbose = true;
|
|
|
|
numArray = new float[args.length - 1];
|
|
|
|
|
|
|
|
for(int i = 0; i < numArray.length; i++) {
|
|
|
|
numArray[i] = Float.parseFloat(args[i+1]);
|
|
|
|
}
|
|
|
|
sortArray();
|
|
|
|
|
|
|
|
calcMean();
|
2014-04-14 12:02:36 -05:00
|
|
|
calcQ1();
|
2014-04-09 16:17:15 -05:00
|
|
|
calcMedian();
|
2014-04-14 12:02:36 -05:00
|
|
|
calcQ3();
|
2014-04-09 16:17:15 -05:00
|
|
|
calcMode();
|
|
|
|
calcRange();
|
2014-04-09 16:55:21 -05:00
|
|
|
calcStdDev();
|
2014-04-10 16:32:16 -05:00
|
|
|
calcVariance();
|
2014-04-08 22:02:56 -05:00
|
|
|
} else {
|
|
|
|
numArray = new float[args.length];
|
2014-04-08 20:58:02 -05:00
|
|
|
|
2014-04-08 22:02:56 -05:00
|
|
|
for(int i = 0; i < args.length; i++) {
|
|
|
|
numArray[i] = Float.parseFloat(args[i]) - 0f;
|
|
|
|
}
|
2014-04-09 16:17:15 -05:00
|
|
|
sortArray();
|
2014-04-08 20:58:02 -05:00
|
|
|
|
2014-04-08 22:02:56 -05:00
|
|
|
calcMean();
|
|
|
|
calcMedian();
|
|
|
|
calcMode();
|
2014-04-09 10:30:04 -05:00
|
|
|
calcRange();
|
2014-04-09 16:55:21 -05:00
|
|
|
calcStdDev();
|
2014-04-10 16:32:16 -05:00
|
|
|
calcVariance();
|
2014-04-08 22:02:56 -05:00
|
|
|
}
|
2014-04-08 20:58:02 -05:00
|
|
|
} else {
|
2014-04-08 22:02:56 -05:00
|
|
|
System.out.println("You did not mention any variables. Use the -h argument for help.");
|
2014-04-08 20:58:02 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-09 16:17:15 -05:00
|
|
|
private static void sortArray() {
|
|
|
|
int nL = numArray.length;
|
|
|
|
float tmp = 0;
|
|
|
|
for(int i = 0; i < nL; i++) {
|
|
|
|
for(int j = (nL-1); j >= (i+1); j--) {
|
|
|
|
if(numArray[j] < numArray[j-1]) {
|
|
|
|
tmp = numArray[j];
|
|
|
|
numArray[j] = numArray[j-1];
|
|
|
|
numArray[j-1] = tmp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-08 20:58:02 -05:00
|
|
|
private static void calcMean() {
|
|
|
|
float sum = 0;
|
|
|
|
|
|
|
|
for(float i: numArray) {
|
|
|
|
sum += i;
|
|
|
|
}
|
|
|
|
|
|
|
|
mean = sum / (float)numArray.length;
|
|
|
|
|
|
|
|
System.out.println("Mean: " + mean);
|
2014-04-10 12:12:59 -05:00
|
|
|
|
|
|
|
if(verbose) {
|
|
|
|
System.out.print("(");
|
|
|
|
for(int i = 0; i < numArray.length; i++) {
|
2014-04-10 16:22:05 -05:00
|
|
|
System.out.print(numArray[i]);
|
|
|
|
if(i != numArray.length -1) {
|
|
|
|
System.out.print(" + ");
|
2014-04-10 12:12:59 -05:00
|
|
|
}
|
|
|
|
}
|
2014-04-10 16:22:05 -05:00
|
|
|
System.out.print(") / " + numArray.length + " = " + mean + "\n\n");
|
2014-04-10 12:12:59 -05:00
|
|
|
}
|
2014-04-08 20:58:02 -05:00
|
|
|
}
|
|
|
|
|
2014-04-14 12:02:36 -05:00
|
|
|
private static void calcQ1() {
|
|
|
|
// Stuff here.
|
|
|
|
}
|
|
|
|
|
2014-04-08 20:58:02 -05:00
|
|
|
private static void calcMedian() {
|
2014-04-09 16:55:21 -05:00
|
|
|
int midVar = numArray.length / 2;
|
2014-04-10 17:24:08 -05:00
|
|
|
boolean even;
|
2014-04-08 20:58:02 -05:00
|
|
|
|
2014-04-10 17:24:08 -05:00
|
|
|
if(numArray.length % 2 == 0) {
|
|
|
|
median = (numArray[midVar] + numArray[midVar-1]) / 2;
|
|
|
|
even = true;
|
|
|
|
} else {
|
|
|
|
median = numArray[midVar];
|
|
|
|
even = false;
|
|
|
|
}
|
2014-04-08 20:58:02 -05:00
|
|
|
|
2014-04-09 16:55:21 -05:00
|
|
|
System.out.println("Median: " + median);
|
2014-04-10 17:08:22 -05:00
|
|
|
|
|
|
|
if(verbose) {
|
|
|
|
for(int i = 0; i < numArray.length; i++) {
|
2014-04-10 18:06:07 -05:00
|
|
|
if(even) {
|
|
|
|
if(i == midVar - 1) {
|
2014-04-10 19:28:56 -05:00
|
|
|
System.out.print(">>" + numArray[i] + " !" + median + "! ");
|
2014-04-10 18:06:07 -05:00
|
|
|
} else if(i == midVar) {
|
2014-04-10 19:28:56 -05:00
|
|
|
System.out.print(numArray[i] + "<< ");
|
2014-04-10 18:06:07 -05:00
|
|
|
} else {
|
|
|
|
System.out.print(numArray[i] + " ");
|
|
|
|
}
|
2014-04-10 17:08:22 -05:00
|
|
|
} else {
|
2014-04-10 18:06:07 -05:00
|
|
|
if(i == midVar) {
|
2014-04-10 19:28:56 -05:00
|
|
|
System.out.print(">>" + numArray[i] + "<< ");
|
2014-04-10 18:06:07 -05:00
|
|
|
} else {
|
|
|
|
System.out.print(numArray[i] + " ");
|
|
|
|
}
|
2014-04-10 17:08:22 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
System.out.print("\n\n");
|
|
|
|
}
|
2014-04-08 20:58:02 -05:00
|
|
|
}
|
|
|
|
|
2014-04-14 12:02:36 -05:00
|
|
|
private static void calcQ3() {
|
|
|
|
// Stuff here.
|
|
|
|
}
|
|
|
|
|
2014-04-08 20:58:02 -05:00
|
|
|
private static void calcMode() {
|
|
|
|
HashMap<Float, Float> fx = new HashMap<Float, Float>();
|
|
|
|
|
|
|
|
for(float x: numArray) {
|
|
|
|
Float f = fx.get(x);
|
|
|
|
if(f == null) {
|
|
|
|
fx.put(x, (float)1);
|
|
|
|
} else {
|
|
|
|
fx.put(x, f + 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
float modeFreq = 0;
|
|
|
|
|
|
|
|
for(Map.Entry<Float, Float> entry: fx.entrySet()) {
|
|
|
|
float freq = entry.getValue();
|
|
|
|
if(freq > modeFreq) {
|
|
|
|
modeFreq = freq;
|
|
|
|
mode = entry.getKey();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
System.out.println("Mode: " + mode + " (frequency: " + modeFreq + ")");
|
2014-04-10 17:08:22 -05:00
|
|
|
|
|
|
|
if(verbose) {
|
|
|
|
for(Map.Entry<Float, Float> entry:fx.entrySet()) {
|
|
|
|
System.out.print(entry.getKey() + "(" + entry.getValue() + ") ");
|
|
|
|
}
|
|
|
|
System.out.print("\n\n");
|
|
|
|
}
|
2014-04-08 20:58:02 -05:00
|
|
|
}
|
2014-04-09 10:30:04 -05:00
|
|
|
|
|
|
|
private static void calcRange() {
|
|
|
|
int l = numArray.length -1;
|
|
|
|
range = numArray[l] - numArray[0];
|
|
|
|
|
|
|
|
System.out.println("Range: " + range);
|
2014-04-09 16:17:15 -05:00
|
|
|
|
|
|
|
if(verbose) {
|
|
|
|
System.out.println(numArray[l] + " - " + numArray[0] + " = " + range + "\n");
|
|
|
|
}
|
2014-04-09 10:30:04 -05:00
|
|
|
}
|
2014-04-09 16:55:21 -05:00
|
|
|
|
|
|
|
private static void calcStdDev() {
|
|
|
|
float difSum = 0;
|
|
|
|
for(int i = 0; i < numArray.length; i++) {
|
|
|
|
difSum += numArray[i] - mean;
|
|
|
|
}
|
|
|
|
|
|
|
|
stdDev = difSum / (float)Math.sqrt((double)numArray.length);
|
|
|
|
|
|
|
|
System.out.println("Standard Deviation: " + stdDev);
|
2014-04-10 16:22:05 -05:00
|
|
|
|
|
|
|
if(verbose) {
|
|
|
|
System.out.print("sqrt((");
|
|
|
|
for(int i = 0; i < numArray.length; i++) {
|
|
|
|
System.out.print(numArray[i] + " - " + mean);
|
|
|
|
if(i != numArray.length - 1) {
|
|
|
|
System.out.print(" + ");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
System.out.print(")^2 / " + numArray.length + ") = " + stdDev + "\n\n");
|
|
|
|
}
|
2014-04-09 16:55:21 -05:00
|
|
|
}
|
2014-04-09 17:00:35 -05:00
|
|
|
|
2014-04-10 16:32:16 -05:00
|
|
|
private static void calcVariance() {
|
2014-04-09 17:00:35 -05:00
|
|
|
// NOTE: I'm doing it this way so I don't have to convert the variables to doubles and lose precision.
|
2014-04-10 16:32:16 -05:00
|
|
|
variance = stdDev * stdDev;
|
2014-04-09 17:00:35 -05:00
|
|
|
|
2014-04-10 16:32:16 -05:00
|
|
|
System.out.println("Variance: " + variance);
|
2014-04-10 16:22:05 -05:00
|
|
|
|
|
|
|
if(verbose) {
|
2014-04-10 16:32:16 -05:00
|
|
|
System.out.println(stdDev + "^2 = " + variance + "\n");
|
2014-04-10 16:22:05 -05:00
|
|
|
}
|
2014-04-09 17:00:35 -05:00
|
|
|
}
|
2014-04-08 20:58:02 -05:00
|
|
|
}
|