Я хочу рассмотреть приложение, которое выполняет следующие действия:
• Чтение из текстового файла набор целых чисел в интервале от 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;
Vectorvec = 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;
Vectorin = 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.
Автор: Евтеев Евгений Александрович
Email: evteev_e2003@mail.ru