In: Computer Science
Copy the program Stats.java to your computer and implement the TBI (To Be Implemented) stats() and checkIfSorted() methods following the instructions given in their method comment blocks.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Stats.java
import java.util.*;
/*
* This Java application calculates some statistics
* given an array of integers.
*
* @creator gdt
* @created 02017.12.15
* @updated 02019.01.21 morphed the assignment
*/
interface StatsConstants {
// used by print() to format output...
String PRINT_BEGIN = "[";
String PRINT_END = "]";
String PRINT_SEPARATOR = ",";
// checkIfSorted() return values...
int UNSORTED = 0;
int ASCENDING = 1;
int DESCENDING = 2;
int SKIP = 3;
}
public class Stats {
public static void main(String[] argv) {
int[][] data = {
null,
{ },
{ 0 },
{ 1, 2 },
{ 1, 1 },
{ 1, 3, 2 },
{ 5, 5, 5, 5, 5 },
{ 2, 0, 5, 4, 8, 5 },
{ 1, 5, 6, 6, 6, 7, 9 },
{ -7, 0, 0, 3, 3, 3, 4, 4 },
{ -2, -2, 0, 1, 1, 2, 2, 2 },
{ -4, -2, 42, 12, 12, 3, -2 },
};
for (int i = 0; i < data.length; i++) {
switch (checkIfSorted(data[i])) {
case StatsConstants.SKIP:
if (data[i] == null)
System.out.println("null element\n");
else if (data[i].length == 0)
System.out.println("empty array\n");
else
System.out.println("???\n");
continue;
case StatsConstants.UNSORTED:
Arrays.sort(data[i]);
break;
case StatsConstants.DESCENDING:
reverseArray(data[i]);
break;
}
printResults(stats(data[i]));
}
}
private static void reverseArray(int[] x) {
for (int i = 0, j = x.length - 1 ; i < j; i++, j--) {
int k = x[i];
x[i] = x[j];
x[j] = k;
}
}
private static void printArray(int[] x, boolean nl) {
System.out.print(StatsConstants.PRINT_BEGIN);
for (int i = 0, j = x.length - 1; i < j; i++)
System.out.print(x[i] + StatsConstants.PRINT_SEPARATOR);
System.out.print(x[x.length - 1] + StatsConstants.PRINT_END);
if (nl) System.out.println();
}
private static void printResults(Results r) {
printArray(r.data, true);
StringBuffer sb = new StringBuffer("...mean: ");
sb.append(r.mean).append("; median: "). append(r.median).
append("; mode: "). append(r.nomode ? "modeless" : r.mode).
append("; cardinality: ").append(r.cardinality).
append("; range: ").append(r.range);
System.out.println(sb);
System.out.println();
}
static class Results {
public int[] data;
public int cardinality;
public int range;
public double mean;
public double median;
public int mode;
public boolean nomode;
}
/*
* TBI (To Be Implemented)...
*
* Instantiates and returns a Results object that
* contains the calculations (statistics) for the
* int[] parameter.
*
* Note: 'mode' is a single solitary number repeated
* more often than any other number. The Results object
* nomode variable is set to true if there is no mode.
*
* The stats() method assumes the int[] is sorted
* in ascending order.
*
* @param data an array if ints
* @return a Results object
*/
private static Results stats(int[] data) {
}
/*
* TBI (To Be Implemented)...
*
* Checks if the contents of the int[] parameter is sorted.
* The method returns values defined in interface StatsConstants.
*
* @param data an array of integers
* @return SKIP if data is null or the array is empty;
* else UNSORTED or DESCENDING or ASCENDING
*/
private static int checkIfSorted(int[] data) {
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The program output must match the following. Note: Every output line that starts with ... is followed by a blank line:
null element empty array [0] ...mean: 0.0; median: 0.0; mode: 0; cardinality: 1; range: 0 [1,2] ...mean: 1.5; median: 1.5; mode: modeless; cardinality: 2; range: 1 [1,1] ...mean: 1.0; median: 1.0; mode: 1; cardinality: 2; range: 0 [1,2,3] ...mean: 2.0; median: 2.0; mode: modeless; cardinality: 3; range: 2 [5,5,5,5,5] ...mean: 5.0; median: 5.0; mode: 5; cardinality: 5; range: 0 [0,2,4,5,5,8] ...mean: 4.0; median: 4.5; mode: 5; cardinality: 6; range: 8 [1,5,6,6,6,7,9] ...mean: 5.714285714285714; median: 6.0; mode: 6; cardinality: 7; range: 8 [-7,0,0,3,3,3,4,4] ...mean: 1.25; median: 3.0; mode: 3; cardinality: 8; range: 11 [-2,-2,0,1,1,2,2,2] ...mean: 0.5; median: 1.0; mode: 2; cardinality: 8; range: 4 [-4,-2,-2,3,12,12,42] ...mean: 8.714285714285714; median: 3.0; mode: modeless; cardinality: 7; range: 46
Answer:
Progam:
import java.util.*;
interface StatsConstants {
String PRINT_BEGIN = "[";
String PRINT_END = "]";
String PRINT_SEPARATOR = ",";
int UNSORTED = 0;
int ASCENDING = 1;
int DESCENDING = 2;
int SKIP = 3;
}
public class Stats {
public static void main(String[] argv)
{
int[][] data = {
null,
{ },
{ 0 },
{ 1, 2 },
{ 1, 1 },
{ 1, 3, 2 },
{ 5, 5, 5, 5, 5 },
{ 2, 0, 5, 4, 8, 5 },
{ 1, 5, 6, 6, 6, 7, 9 },
{ -7, 0, 0, 3, 3, 3, 4, 4 },
{ -2, -2, 0, 1, 1, 2, 2, 2 },
{ -4, -2, 42, 12, 12, 3, -2 },
};
for (int i = 0; i
< data.length; i++) {
switch (checkIfSorted(data[i])) {
case StatsConstants.SKIP:
if (data[i] == null)
System.out.println("null element\n");
else if (data[i].length == 0)
System.out.println("empty array\n");
else
System.out.println("???\n");
continue;
case StatsConstants.UNSORTED:
Arrays.sort(data[i]);
break;
case StatsConstants.DESCENDING:
reverseArray(data[i]);
break;
}
printResults(stats(data[i]));
}
}
private static void reverseArray(int[] x)
{
for (int i = 0, j =
x.length - 1 ; i < j; i++, j--) {
int k = x[i];
x[i] = x[j];
x[j] = k;
}
}
private static void printArray(int[] x,
boolean nl) {
System.out.print(StatsConstants.PRINT_BEGIN);
for (int i = 0, j =
x.length - 1; i < j; i++)
System.out.print(x[i] + StatsConstants.PRINT_SEPARATOR);
System.out.print(x[x.length - 1] + StatsConstants.PRINT_END);
if (nl)
System.out.println();
}
private static void printResults(Results r)
{
printArray(r.data,
true);
StringBuffer sb = new
StringBuffer("...mean: ");
sb.append(r.mean).append("; median: "). append(r.median).
append("; mode: "). append(r.nomode ? "modeless" : r.mode).
append("; cardinality: ").append(r.cardinality).
append("; range: ").append(r.range);
System.out.println(sb);
System.out.println();
}
static class Results {
public int[] data;
public int
cardinality;
public int range;
public double
mean;
public double
median;
public int mode;
public boolean
nomode;
}
//Result of stats
private static Results stats(int[] data) {
Results result = new
Results();
int sum = data[0];
int maxCount = 0, count
= 0;
result.data =
data;
result.cardinality =
data.length;
result.range =
data[data.length-1] - data[0];
result.mode =
data[0];
result.nomode =
data.length != 1;
if (data.length % 2
== 0)
result.median = (data[data.length/2] + data[(data.length/2) - 1]) /
2.0;
else
result.median = data[data.length/2];
for (int i = 1; i
< data.length; i++) {
sum += data[i];
if (data[i] == data[i-1]) {
count++;
if (count > maxCount) {
result.nomode = false;
result.mode = data[i];
maxCount = count;
} else if (count == maxCount) {
result.nomode = true;
}
} else {
count = 0;
}
}
result.mean = sum / (double) data.length;
return result;
}
// Checks if sorted method
private static int checkIfSorted(int[] data)
{
if (data == null ||
data.length == 0)
return StatsConstants.SKIP;
if (data[0] <
data[data.length - 1]) {
for (int i = 0; i < data.length-1; i++) {
if (data[i] > data[i + 1])
return StatsConstants.UNSORTED;
}
return StatsConstants.ASCENDING;
} else if (data[0] >
data[data.length - 1]) {
for (int i = 0; i < data.length-1; i++) {
if (data[i] < data[i + 1])
return StatsConstants.UNSORTED;
}
return StatsConstants.DESCENDING;
}
return
StatsConstants.UNSORTED;
}
}
Out put: