Varargs
Varargs– удобный способ передачи в метод неопределенного количества параметров в виде массива.
public String loadOne(String... values) {
// …
}
Метод loadOneможет быть вызван с любым количеством строковых параметров (от 0 до бесконечности), которые будут автоматически собраны в массивvalues. Работа с ними в теле метода осуществляется как с обычным массивом.
Пример решения Условие
Разработать оконное приложение, выполняющие нижеописанные задачи. Для каждой задачи должен быть создан отдельный текстовый файл, в который должны записываться входные параметры и результаты выполнения задачи. Приложение должно читать эти данные из файлов и выполнять расчет только в том случае, если в файле еще нет результата для этих входных параметров. Кроме того, приложение должно иметь возможность вывести информацию об имени и группе автора и должно быть собрано в *.jar.
Принять две строки и создать новую строку, состоящую из первой буквы первой строки и последней буквы второй строки. Если одна или обе входные строки пустые, заменять соответствующие буквы на символ ‘@’.
Принять массив целых чисел и вывести 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;
}
}