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