Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java-lekcii-2016-01-17 / presentation-nov-28.docx
Скачиваний:
13
Добавлен:
27.03.2016
Размер:
44.49 Кб
Скачать

Varargs

Varargs– удобный способ передачи в метод неопределенного количества параметров в виде массива.

public String loadOne(String... values) {

// …

}

Метод loadOneможет быть вызван с любым количеством строковых параметров (от 0 до бесконечности), которые будут автоматически собраны в массивvalues. Работа с ними в теле метода осуществляется как с обычным массивом.

Пример решения Условие

Разработать оконное приложение, выполняющие нижеописанные задачи. Для каждой задачи должен быть создан отдельный текстовый файл, в который должны записываться входные параметры и результаты выполнения задачи. Приложение должно читать эти данные из файлов и выполнять расчет только в том случае, если в файле еще нет результата для этих входных параметров. Кроме того, приложение должно иметь возможность вывести информацию об имени и группе автора и должно быть собрано в *.jar.

  1. Принять две строки и создать новую строку, состоящую из первой буквы первой строки и последней буквы второй строки. Если одна или обе входные строки пустые, заменять соответствующие буквы на символ ‘@’.

  2. Принять массив целых чисел и вывести true, если все числа массива равны либо 1, либо 4, иfalseв противном случае.

Build.Gradle

apply plugin: 'java'

// Кодировка, используемая при компиляции

// (чтобы при запуске *.jar правильно отображались русские буквы)

compileJava.options.encoding = 'UTF-8'

jar {

manifest {

attributes 'Main-Class' : 'ru.mami.Main'

}

}

Ru.Mami.Main

package ru.mami;

import javafx.application.Application;

import javafx.geometry.Insets;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.Menu;

import javafx.scene.control.MenuBar;

import javafx.scene.control.MenuItem;

import javafx.scene.control.TextField;

import javafx.scene.layout.BorderPane;

import javafx.scene.layout.GridPane;

import javafx.scene.text.Text;

import javafx.scene.text.TextAlignment;

import javafx.stage.Stage;

public final class Main extends Application {

private BorderPane root;

@Override

public void start(Stage primaryStage) throws Exception {

// заголовок окна

primaryStage.setTitle("Exam");

// создание панели

root = new BorderPane();

// указание размера панели

root.setPrefSize(640, 480);

// создание панели меню

MenuBar menuBar = new MenuBar();

// вызов функции, заполняющей панель меню

createMenus(menuBar);

// установка панели меню в самый верх окна

root.setTop(menuBar);

// создание сцены

Scene scene = new Scene(root);

// установка сцены

primaryStage.setScene(scene);

// отображение окна

primaryStage.show();

}

public static void main(String[] args) {

launch(args);

}

/**

* Создание меню для верхней панели. Вынесено в отдельный метод, чтобы не

* засорять start

*

* @param bar

* панель меню, в которую должны быть добавлены созданные меню

*/

private void createMenus(MenuBar bar) {

Menu menuTasks = new Menu("Tasks");

MenuItem first = new MenuItem("First");

// создание обработчика щелчка по элементу меню

// setOnAction принимает объект класса, реализующего интерфейс, в

// котором есть только один метод

// начиная с 8 версии java, такой объект можно создать, написав список

// параметров, стрелку -> и действия, совершаемые в теле метода (lambda

// expression). Если действие только одно (как в данном случае), можно

// опустить фигурные скобки и точку с запятой в конце. Пример со

// скобками находится в методах createTaskPaneFirst и

// createTaskPaneSecond

first.setOnAction(event -> showFirstTask());

MenuItem second = new MenuItem("Second");

second.setOnAction(event -> showSecondTask());

menuTasks.getItems().addAll(first, second);

Menu menuHelp = new Menu("Help");

MenuItem about = new MenuItem("About");

menuHelp.getItems().add(about);

about.setOnAction(event -> this.showInfo());

bar.getMenus().addAll(menuTasks, menuHelp);

}

/**

* Создание объекта класса GridPane без дочерних элементов. Метод написан

* для удобства, чтобы указывать параметры GridPane только в одном месте

*

* @return созданный объект

*/

private GridPane createEmptyGridPane() {

GridPane pane = new GridPane();

pane.setPadding(new Insets(15));

pane.setHgap(15);

pane.setVgap(15);

return pane;

}

/**

* Заполнить все пространство окна, кроме меню, панелью, содержащей

* элементы, необходимые для решения первой задачи

*/

private void showFirstTask() {

root.setCenter(createTaskPaneFirst());

}

/**

* Создать панель с элементами, необходимыми для решения первой задачи

*

* @return

*/

private GridPane createTaskPaneFirst() {

GridPane pane = createEmptyGridPane();

TextField first = new TextField();

pane.add(first, 0, 0);

TextField second = new TextField();

pane.add(second, 0, 1);

Text result = new Text();

pane.add(result, 0, 2);

Button clear = new Button("Clear");

clear.setOnAction(event -> showFirstTask());

clear.setMaxWidth(Double.MAX_VALUE);

pane.add(clear, 0, 3);

Button compute = new Button("Compute");

// lambda expression

compute.setOnAction(event -> {

result.setText(performTaskOne(first.getText(), second.getText()));

});

compute.setMaxWidth(Double.MAX_VALUE);

pane.add(compute, 0, 4);

return pane;

}

/**

* Решить первую задачу

*

* @param first

* первая строка

* @param second

* вторая строка

* @return результат обработки строк

*/

private String performTaskOne(String first, String second) {

// создать объект класса FileCache для работы с кэшем

// файл t1.txt будет создан либо в корневой директории проекта, либо в

// той директории, в которой находится *.jar

FileCache cache = new FileCache("t1.txt");

// попытка загрузить решение для соответствующих входных данных из кэша

String result = cache.loadOne(first, second);

// если получилось, просто вернуть полученное значение

if (result != null) {

return result;

}

// иначе рассчитать результат в соответствии с условиями задачи

result = "";

if (first.isEmpty()) {

result += "@";

} else {

result += first.substring(0, 1);

}

if (second.isEmpty()) {

result += "@";

} else {

result += second.substring(second.length() - 1);

}

// сохранить результат расчета в файл

cache.save(first, second, result);

// и вернуть результат

return result;

}

/**

* Заполнить все пространство окна, кроме меню, панелью, содержащей

* элементы, необходимые для решения второй задачи

*/

private void showSecondTask() {

root.setCenter(createTaskPaneSecond());

}

/**

* Создать панель с элементами, необходимыми для решения второй задачи

*

* @return

*/

private GridPane createTaskPaneSecond() {

GridPane pane = createEmptyGridPane();

TextField input = new TextField();

pane.add(input, 0, 0);

Text result = new Text();

pane.add(result, 0, 1);

Button clear = new Button("Clear");

clear.setOnAction(event -> showSecondTask());

clear.setMaxWidth(Double.MAX_VALUE);

pane.add(clear, 0, 2);

Button compute = new Button("Compute");

// lambda expression

compute.setOnAction(event -> {

result.setText(performTaskTwo(input.getText()));

});

compute.setMaxWidth(Double.MAX_VALUE);

pane.add(compute, 0, 3);

return pane;

}

/**

* Решить вторую задачу. Работает аналогично performTaskOne

*

* @param line

* входные данные

* @return результат

*/

private String performTaskTwo(String line) {

FileCache cache = new FileCache("t2.txt");

String result = cache.loadOne(line);

if (result != null) {

return result;

}

String[] numbersAsStrings = line.split(", ");

int[] numbers = new int[numbersAsStrings.length];

for (int i = 0; i < numbersAsStrings.length; ++i) {

numbers[i] = Integer.valueOf(numbersAsStrings[i]);

}

boolean onlyRequiredNumbers = true;

for (int number : numbers) {

if (number != 1 && number != 4) {

onlyRequiredNumbers = false;

break;

}

}

result = Boolean.toString(onlyRequiredNumbers);

cache.save(line, result);

return result;

}

/**

* показать панель с информацией об авторе

*/

private void showInfo() {

root.setCenter(createInfoPane());

}

/**

* Создать панель с информацией об авторе

*

* @return новый объект класса Text с информацией

*/

private Text createInfoPane() {

Text text = new Text("Автор:\nВасилий Петрович Задов,\nгруппа 111-222");

text.setTextAlignment(TextAlignment.CENTER);

return text;

}

}

Соседние файлы в папке java-lekcii-2016-01-17