Я создаю свою собственную командную строку на java. Все остальные команды я реализовал. Я хочу попробовать выполнить команды на основе порядка параметров, например)
команда: (история Y C), команда: (история C Y)
(история Y) указывает на печать предыдущей истории количество команд с числами (Y), а (C) указывает на очистку команд истории.
поэтому (история C Y) должна сначала очистить команду истории и вывести Y количество предыдущих команд, которые будут нулевыми;
(история Y C) должна напечатать Y количество предыдущих команд, а затем очистить историю команд.
Как мне реализовать мой код, выводящий базу результатов в другом порядке
Я разделяю команды с помощью «» (пробела), используя split.
и это то, что у меня сейчас есть
if (Split[0].equals("history")) {
if (Split[1].equals("Y")) {
int num = int parseint(command)
}
if (Split[2].equals("C")) {
" Then clear command"
}
}
из приведенного выше кода это история Y C как мне реализовать это по выбору пользователя, чтобы разместить в другом порядке?




Метод основной() вашего приложения уже принимает строковый массив команд из командной строки (для этого предназначен параметр аргументы), но он работает по-разному в зависимости от того, как предоставлены аргументы командной строки. Все аргументы командной строки считаются строковым массивом объектов String независимо от того, заключены эти аргументы в кавычки или нет, например:
Если ваше скомпилированное приложение называется: MyApp.jar и в методе основной() у нас есть простой код для вывода предоставленных аргументов командной строки в окно консоли, например:
public class MyApp {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
}
Когда вы запускаете приложение составлен, скажем, из командной строки Windows (cmd) как:
java -jar MyApp.jar Hi, my name is Johnny Walker
В окне отобразится:
Hi,
my
name
is
Johnny
Walker
Вы можете видеть, что каждый элемент, поставляемый в командной строке приложения, который разделен одним (или больше) пробелом, считается отдельным аргументом командной строки. Аргументы метода основной() всегда разделяются пробелом, а не запятой (,). Однако, если вы хотите, чтобы вся эта строка передавалась вашему приложению как один аргумент командной строки, вам необходимо заключить всю эту строку в кавычки, например:
java -jar MyApp.jar "Hi, my name is Johnny Walker"
В окне отобразится:
Hi, my name is Johnny Walker
Если вы хотите добавить больше таких строк в командную строку, тогда все они должны быть заключены в кавычки и разделены пробелом, например:
java -jar MyApp.jar "Hi, my name is Johnny Walker" "What's yours?" "Is it Bob?"
В окне отобразится:
Hi, my name is Johnny Walker
What's yours?
Is it Bob?
Учитывая вышесказанное, я не понимаю, в чем заключается ваша проблема. Если пользователю вашего приложения разрешено указывать аргументы командной строки в любом порядке, пусть он это сделает. На мой взгляд, если есть много разных аргументов командной строки, которые могут быть предоставлены, то имеет смысл разрешить их указывать в случайном порядке, поскольку было бы чрезвычайно сложно запомнить точный порядок, в котором они должны быть указаны. Это приложение должно определять необходимость порядка после получения аргументов.
Поскольку вы хотите создать свой собственный синтаксический анализатор командной строки, который будет состоять из определенной категориальной функции приложения или, возможно, нескольких конкретных категориальных функций, вам нужно будет проинструктировать пользователя о том, как именно аргументы командной строки должны быть переданы в приложение, даже с учетом контекст справки должен быть предоставлен с использованием типичного параметра командной строки /?, например:
There are four application categorical functions available that can be accessed via the Command Line (History, Current, Modify, and Delete). Each function along with their specific parameters must be supplied as quoted strings. The functions and their respective parameters can be supplied in any order, for example:
java -jar MyApp.jar "modify r l n" "history c r"
See application documentation for more information regarding Command Line or use this Command Line Option:
java -jar MyApp.jar /?
Текстовый файл справки для вашего приложения может выглядеть примерно так:
MyApp Help:
There are four categorical application functions available that can be
accessed via the Command Line (History, Current, Modify, and Delete).
Each function along with their specific parameters must be supplied as
quoted strings. The functions and their respective parameters can be
supplied in any order, for example:
**java -jar MyApp.jar "modify r=12 l=hypo n=43.55" "history c r=12"**
Categorical Application Functions:
Letter case is optional.
------------------------------------------------------------------
HISTORY:
Display Record(s) History.
C Clear History.
R= Integer - Record Number (0 for all).
------------------------------------------------------------------
CURRENT:
Displays Current Record and Linked Record (if any).
Optionaly displays defined Variable Name.
R= Integer - Make Record Current (0 for No Record).
L= Integer - Linked To Record Number (0 for No Record).
N Optional- Also Display Variable Name.
------------------------------------------------------------------
MODIFY:
Modifies a Record Culture.
R= Integer - Record Number to Modify (0 for All).
L= Integer - Change Linked Record Number (0 for No
Record).
N= String - Change Variable Name ("" for No Name).
------------------------------------------------------------------
DELETE:
Deletes a Record Culture and optionally removes any Links to it.
Records start from a value of 1.
R= Integer - Record Number to Delete (0 for All).
y= Boolean - True to Remove related Links to this
record.
------------------------------------------------------------------
See application documentation for more information regarding Command
Line or use this Command Line Option:
java -jar MyApp.jar /?
а в приложении метод основной() для работы с параметрами командной строки может выглядеть примерно так:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MyApp {
public static void main(String[] args) {
// Are there Command Line arguments?
if (args.length > 0) {
// Yes there is...
for (int i = 0; i < args.length; i++) {
String[] suppliedArgs = args[i].toLowerCase().split("\\s+");
// Function Categories
switch (suppliedArgs[0]) {
case "/?":
doDisplayHelpInConsole();
System.exit(0);
break;
case "history":
doHistory(suppliedArgs);
break;
case "current":
doCurrent(suppliedArgs);
break;
case "modify":
doModify(suppliedArgs);
break;
case "delete":
doDelete(suppliedArgs);
break;
default:
System.out.println("Skipping Unknown Command Line Function (" +
suppliedArgs[0] + ")!");
}
}
}
System.out.println("DONE!");
}
private static void doDisplayHelpInConsole() {
// Prepare to read the MyAppHelp.txt file from
// the run location of MyApp.jar. This help text
// file must reside in the same location the jar
// file resides in.
File helpFile = new File(new File("").getAbsolutePath() +
File.separator + "MyAppHelp.txt");
if (!helpFile.exists()) {
System.out.println("Help is not available - File Not Found!" +
System.lineSeparator() + "[" + helpFile.getAbsolutePath() +
"]");
return;
}
try {
// Try with Resources - Auto closes file.
try (Scanner reader = new Scanner(helpFile)) {
while (reader.hasNextLine()) {
System.out.println(reader.nextLine());
}
}
}
catch (FileNotFoundException ex) {
Logger.getLogger(MyApp.class.getName()).log(Level.SEVERE, null, ex);
// or use: ex.printStackTrace();
}
}
private static void doHistory(String[] args) {
for (int i = 1; i < args.length; i++) {
// Split the parameter name and its value
String[] params = args[i].split(" = |= | =| = ");
// Process Parameters
switch (params[0]) {
case "c":
// Do what C is suppose to do...
clearHistory(); // A method to clear history
System.out.println("History Cleared!");
break;
case "r":
// Do what R is suppose to do...
// Is the supplied value Numerical?
if (params[1].matches("\\d+")) {
// Yes...convert to integer
int recordNum = Integer.parseInt(params[1]);
displayRecord(recordNum); // A method to display record
}
break;
default:
System.out.println("Unknown Assignment for History (" +
params[0] + ")! History Failed!");
}
}
}
private static void doCurrent(String[] args) {
int recordNum = 0;
for (int i = 1; i < args.length; i++) {
// Split the parameter name and its value
String[] params = args[i].split(" = |= | =| = ");
// Process Parameters
switch (params[0]) {
case "r":
// Do what R is suppose to do...
// Is the supplied value Numerical?
if (params[1].matches("\\d+")) {
// Yes...convert to integer
recordNum = Integer.parseInt(params[1]);
displayRecord(recordNum); // A method to display record
}
break;
case "l":
// Do what L is suppose to do...
// Is the supplied value Numerical?
if (params[1].matches("\\d+")) {
// Yes...convert to integer
int lRecordNum = Integer.parseInt(params[1]);
System.out.println("Linked to Record Number: " + lRecordNum);
}
break;
case "n":
// Do what N is suppose to do...
String varName = getVariableName(recordNum);
System.out.println("Variable Name: " + varName);
break;
default:
System.out.println("Unknown Assignment for Current (" +
params[0] + ")! Current Failed!");
}
}
}
private static void doModify(String[] args) {
int recordNum = 0;
for (int i = 1; i < args.length; i++) {
// Split the parameter name and its value
String[] params = args[i].split(" = |= | =| = ");
// Process Parameters
switch (params[0]) {
case "r":
// Do what R is suppose to do...
// Is the supplied value Numerical?
if (params[1].matches("\\d+")) {
// Yes...convert to integer
recordNum = Integer.parseInt(params[1]);
}
break;
case "l":
// Do what L is suppose to do...
// Is the supplied value Numerical?
if (params[1].matches("\\d+")) {
// Yes...convert to integer
int lRecordNum = Integer.parseInt(params[1]);
System.out.println("Modifying Linked Record Number To: " + lRecordNum);
modifyLinkedRecordNumber(recordNum, lRecordNum);
}
break;
case "n":
// Do what N is suppose to do...
String varName = getVariableName(recordNum);
System.out.println("Modifying Variable Name To: " + varName);
modifyVariableName(recordNum, varName);
break;
default:
System.out.println("Unknown Assignment for Modify (" +
params[0] + ")! Modify Failed!");
}
}
}
private static void doDelete(String[] args) {
int recordNum = 0;
for (int i = 1; i < args.length; i++) {
// Split the parameter name and its value
String[] params = args[i].split(" = |= | =| = ");
// Process Parameters
switch (params[0]) {
case "r":
// Do what R is suppose to do...
// Is the supplied value Numerical?
if (params[1].matches("\\d+")) {
// Yes...convert to integer
recordNum = Integer.parseInt(params[1]);
if (deleteRecord(recordNum)) {
System.out.println("Record Number " + recordNum +
" has been Deleted.");
}
}
break;
case "y":
// Do what Y is suppose to do...
boolean doDel = false;
if (params[1].equalsIgnoreCase("true")) {
if (deleteAllLinksTo(recordNum)) {
System.out.println("All Links related to Record Number " +
recordNum + " have been removed.");
}
}
else if (!params[1].equalsIgnoreCase("false")) {
System.out.println("Unknown Boolean argument supplied for Y "
+ "parameter of the DELETE function (" +
params[i] + ")! Link Deletion Failed!");
}
break;
default:
System.out.println("Unknown Assignment for Delete (" +
params[0] + ")! Delete Failed!");
}
}
}
private static void clearHistory() {
// A method to clear all history.
//Code goes here........
}
private static void displayRecord (int recordNum) {
// A method to display a specific record.
//Code goes here........
}
private static String getVariableName(int recNum) {
// A method to get variable name for a specific record.
String varName = "";
//Code goes here........
return varName;
}
private static void modifyLinkedRecordNumber(int recordNum, int newLinkedNum) {
// A method to modify the liknked record number for a speciic record.
//Code goes here........
}
private static void modifyVariableName(int recordNum, String varName) {
// A method to modify the Variable Name for a speciic record.
//Code goes here........
}
private static boolean deleteRecord (int recordNum) {
// A method to Delete a speciic record.
//Code goes here........
return true;
}
private static boolean deleteAllLinksTo (int recordNum) {
// A method to Delete ALL Links to the supplied record.
//Code goes here........
return true;
}
}
Если вы читаете команды из командной строки, тогда у вас должен быть массив аргументов от параметра к основному методу. Если вы разбираете произвольные текстовые строки, идея разделения усложняется, если вам нужно иметь дело с цитируемыми аргументами. В любом случае вам следует просто перебрать полученный массив аргументов и обработать их по порядку.