Вчера и позавчера писал программу, которая читает файл и потом рисует диаграмму, в итоге у меня ощущение, что это как-то всё неакуратно и громоздко, то, что я написал. «Сложность» заключалась в том, что из текстового файла формата:
1999
I
Student_Name0 8989 87
Student_Name1 6855 34
-2000
=IMM
Student_Name3 6767 77
....и т.д.
нужно было считать всё, но использовать только проценты (которые стоят только в полях с именами студентов - поседние две цифры), и потом отсортировать их по заданному пользователем числу колонок (т.е. какое количество студентов имеет от 0 до 9%, 10-19% - это если пользователь задал 10 колонок).
Интерфейс самой диаграммы был написан за меня, поэтому моя программа только сортирует колонки и рисует диаграмму. Соб-но сам код:
package statistics;
import java.text.DecimalFormat;
import java.util.Scanner;
import java.lang.String;
import ui.StaafDiagramUserInterface; // интрфейс диаграммы
import ui.UserInterfaceFactory;
import ui.UIHulpMethodes;
class Statistics {
UIHulpMethodes hlp;
StaafDiagramUserInterface sd;
int aantalStaven, lineLength, numberOfColumns, indexOfColumn;
Statistics() {
Scanner rangeOfDiagram = new Scanner(System.in);
System.out.printf("Количество колонок: ");
numberOfColumns = rangeOfDiagram.nextInt();
aantalStaven = numberOfColumns; // aantalStaven - число колонок - заданная в интерфейсе диаграммы переменная
sd = UserInterfaceFactory.geefStaafDiagramUI(aantalStaven);
UIHulpMethodes.vraagGebruikerOmInvoer(); // спросить пользователя файл
}
void parseLine(String readLine) {
Scanner readNextScanner = new Scanner(readLine);
for (int i = 0; i < readLine.length(); i++) {
//read length of line
lineLength = i;
}
if (lineLength < 7) {
String yearsAndStudies = readNextScanner.next();
Scanner readYearsAndStudiesScanner = new Scanner(yearsAndStudies);
readYearsAndStudies(readYearsAndStudiesScanner);
}
else { // if line is longer than 7 read it and divide names and game results
readNextScanner.useDelimiter("\t");
String studentNames = readNextScanner.next();
String gameResults = readNextScanner.next();
Scanner gameResultsScanner = new Scanner(gameResults);
sortPercentagesIntoColumns(gameResultsScanner); // then call function to sort percentages;
}
}
void readYearsAndStudies(Scanner readYearsAndStudiesScanner) {
String readYearsAndStudies = readYearsAndStudiesScanner.next();
if (readYearsAndStudies.matches("-")) {
String years = readYearsAndStudiesScanner.next();
}
else if (readYearsAndStudies.matches("I")) {
String study = "I";
}
else if (readYearsAndStudies.matches("=")) {
String study = readYearsAndStudiesScanner.next();
}
}
void sortPercentagesIntoColumns(Scanner gameResultsScanner) {
String averageWaittime = gameResultsScanner.next();
String percentageOfStones = gameResultsScanner.next();
int currentPercentage = Integer.parseInt(percentageOfStones); // parse percentages to type int;
// here are defined two variables which calculate "size" of columns in diagram by division of 100;
double step = 100.0 / numberOfColumns;
double adder = 100.0 / numberOfColumns;
indexOfColumn = 0;
// this part of function "walks" through all columns
// in order to decide which index of column to increase;
while (step < currentPercentage) { // so, while step is lower than a given percentage
step += adder; // it increases variable "step" by "adder" and "steps"
indexOfColumn++; // to the next column;
}
if (indexOfColumn == numberOfColumns) { // if loop stepped over the last column
indexOfColumn--; // add index to this last column;
}
sd.verhoogStaaf(indexOfColumn); // добавить один к колонке
}
void start() {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
String readLine = in.nextLine();
parseLine(readLine);
}
// variables to create an array of strings (names of columns);
double adder = 100.0 / numberOfColumns;
double from = 0; // every column has a name of "from" and "to" in percentages;
double to = 100.0 / numberOfColumns - 1; // -1 here because names should be in format 0-9% , 10-19%, etc..
DecimalFormat df = new DecimalFormat("#.#");
for (indexOfColumn = 0; indexOfColumn < numberOfColumns; indexOfColumn++) {
if (indexOfColumn == numberOfColumns - 1) {
to = 100; // if it's on the last column, assign "to" to 100%;
}
sd.geefStaafNaam(indexOfColumn, df.format(from) + "-" + df.format(to) + "%");
sd.zetLaatNamenZien(true);
sd.toon();
from += adder; // use "adder" "to walk" through array;
to += adder;
}
}
public static void main(String[] argv) {
new Statistics().start();
}
}
выглядит в итоге это всё вот так:
http://www.freeimagehosting.net/uploads/c27b76a856.png
вопрос - какие части можно упростить/сделать иначе/укоротить и т.д. ..?