Вывод гистограммы распределения чисел от 0 до максимального по интервалам размером 10 на Java

4 апреля 2009

Я хочу рассмотреть приложение, которое выполняет следующие действия:

  • Чтение из текстового файла набор целых чисел в интервале от 0 до максимального, найденного в файле;
  • Вывод в текстовый файл гистограмму распределения этих чисел по интервалам размером 10;
  • Выделение максимального числа в отдельный интервал.

И так, приступим к написанию этой довольно простой программы. Нам нужно создать 2 файла: входной (“file1.txt”) и выходной(“file2.txt”). Во входной записываем числа от 0, пример входного файла показан ниже. В выходной файл будет выводиться результат работы нашей программы.

Пример входного файла:
23
45
12
26
76
89
100
26
78
54
11
16
28
41
21
Пример выходного файла:
00-09:
10-19: ***
20-29: *****
30-39:
40-49: **
50-59: *
60-69:
70-79: **
80-89: *
90-99:
100: *

Для реализации программы мы используем 2 метода и 4 объекта. Давайте рассмотрим каждый из них. Методы:
1. “main(String[] args)” – главный метод, выполняющий все основные действия по работе программы, такие как чтение из файла, генерирование конечной строки и запись конечной строки в файл.

Главный метод:

public static void main(String[] args) {
	String file_enter = "file1.txt", file_out = "file2.txt";
	File file = new File(file_out);
	try {
		PrintWriter pw = new PrintWriter(file);
		String str;
		for(int i = 0, j = 9; i < = getMax(file_enter); i += 10, j += 10) {
			str = i == 0 ? "00-0" + j + ": " : i == getMax(file_enter) ? i + ": " : i + "-" + j + ": ";
			pw.println(str + getNum(file_enter, i, j));
		}
		pw.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

2. “PrintFile(String name)” – вывод содержимого файла, в котором находится гистограмма распределения чисел. Параметр “name”- это путь к выходному файлу.

Метод “PrintFile(String name)”

public void PrintFile(String name) {
	try {
		RandomAccessFile bstr =
		new RandomAccessFile(name, "r");
		String s;
		while( (s = bstr.readLine()) != null )
			System.out.println(s);
		bstr.close();
	}
	catch (IOException e) {
		e.printStackTrace();
	}
}

Теперь рассмотрим все объекты:
1. “getMax(String name)” – получает максимальное число, находящееся во входном файле. Параметр “name”- это путь к выходному файлу. Файл считывается построчно, по ходу чтения выполняется проверка на присутствие числа в данной строке. Далее, если число было найдено, добавляем это число в векторный массив “vec”, затем путем перехода по всему массиву находим максимальное число и используем “return” для передачи результата “главному методу”.
Метод “getMax(String name)”

public int getMax(String name) {
	int max = 0;
	try	{
		RandomAccessFile br =
		new RandomAccessFile(name, "r");
		String s;
		Vector vec = new Vector();

		while( (s = br.readLine()) != null )
			if( getNumber(s) != -1 )
				vec.add(getNumber(s));

		max = vec.get(0);
		for(int j = 0; j < vec.size(); j++)
			if( vec.get(j) > max )
				max = vec.get(j);

		vec.clear();
		br.close();
	}
	catch(Exception ex) {
		System.out.println(ex.toString());
	}
	return max;
}

2. “getNum(String name, int a, int b)” – строит гистограмму распределения чисел в виде “*” (звездочек), где “name”- это путь к выходному файлу, “a” и “b” – диапазон в виде от “a” до “b” для проверки вхождения числа в этот диапазон.

Метод “getNum(String name, int a, int b)”

public String getNum(String name, int a, int b) {
	int i = 0;
	String s2 = "";
	try	{
		RandomAccessFile br =
		new RandomAccessFile(name, "r");
		String s;
		Vector in = new Vector();

		while( (s = br.readLine()) != null ) {
			if( getNumber(s) != -1 ) {
				i = getNumber(s);
				in.addElement(i);
				if(i >= a && i < = b)
					s2 = s2 + "*";
			}
		}

		in.clear();
		br.close();
	}
	catch(Exception ex) {
		System.out.println(ex.toString());
	}
	return s2;
}

3. “getNumber(String str)” – декодирование строки в число. Параметр “str”- строка из входного файла. Также выполняет проверку на соответствующий тип данных, если “str” содержит символы вместо чисел, объект возвращает значение равное “-1”.

Метод “getNumber(String str)”

public int getNumber(String str) {
	if( isNumber(str) )	{
		Integer intVal = new Integer(str);
		return intVal.intValue();
	}
	return -1;
}

4. “isNumber(String str)” – собственно сам объект, который проверяет значение параметра “str”, если “str” содержит символы отличные от цифр, объект возвращает значение равное “false”.

Метод “isNumber(String str)”

public boolean isNumber(String str) {
	for(int i = 0; i < str.length(); i++)
		if ( !Character.isDigit(str.charAt(i)) )
			return false;

	return true;
}

Вот и всё, все необходимые для реализации методы и объекты написаны, программа готова к работы. Теперь мы можем получить гистограмму распределения чисел больше 0 по интервалам размером 10.

Автор: Евтеев Евгений Александрович