Java 如何以任意顺序给出命令行参数?
我有两个枚举,一个用于应用程序,一个用于环境。我希望能够以任意顺序给出这些参数,因此我可以给出-app app1 app1-env env1 env2或-env env1 env2-app app1 app2。现在我只能做第一个。我还想说-app app1 app2,它在所有环境中运行我列出的所有应用程序,在所有环境中也是如此,但我更关心的是能否按任意顺序提供它们Java 如何以任意顺序给出命令行参数?,java,command-line-arguments,Java,Command Line Arguments,我有两个枚举,一个用于应用程序,一个用于环境。我希望能够以任意顺序给出这些参数,因此我可以给出-app app1 app1-env env1 env2或-env env1 env2-app app1 app2。现在我只能做第一个。我还想说-app app1 app2,它在所有环境中运行我列出的所有应用程序,在所有环境中也是如此,但我更关心的是能否按任意顺序提供它们 for(int i = 0; i<args.length; i++) {
for(int i = 0; i<args.length; i++)
{
if(args[i].equals("-app"))
{
indexOfApp = i;
}else if(args[i].equals("-env"))
{
indexOfEnv = i;
}
}
int countOfApp = -1;
int countOfEnv = -1;
if(indexOfApp != -1 && indexOfEnv != -1)
{
countOfApp = indexOfEnv - 1;
countOfEnv = args.length - (indexOfEnv + 1);
}
System.out.println(countOfApp);
System.out.println(countOfEnv);
for(int appIndex = indexOfApp + 1; appIndex < countOfApp + 1; appIndex++){
appList.add(args[appIndex]);
}
for(String item : appList )
{
Application app = Application.valueOf(Application.class, item);
appList2.add(app);
}
for(int envIndex = indexOfEnv + 1; envIndex < args.length; envIndex++){
envList.add(args[envIndex]);
}
for(String item : envList )
{
Environment env = Environment.valueOf(Environment.class, item);
envList2.add(env);
}
} System.out.println(appList); System.out.println(envList);
Application.chooseAppTest(appList2, envList2);
对于(int i=0;i它可以简单得多:
boolean isApp = false;
boolean isEnv = false;
for (int i = 0; i<args.length; i++) {
if (args[i].equals ("-app")) {
isApp = true;
isEnv = false;
} else if (args[i].equals ("-env")) {
isEnv = true;
isApp = false;
} else if (isEnv) {
envList.add(args[i]);
} else if (isApp) {
appList.add(args[i]);
}
}
boolean isApp=false;
布尔isEnv=false;
对于(int i=0;i来说,自己实现这一点非常简单。使用前导的-
作为指示符。
试试这个代码。我想这就是你想要的。这个解决方案也非常通用,
即使您稍后添加其他参数类型(不仅仅是-app
和-env
),它也可以工作
上周有人给了你这个问题的另一个版本的答案,你已经问了三四次了,这正是你想要的。我现在找不到它(它可能已被删除),但它基本上是以下代码:
public static void main(String[] args) {
List<String> apps = new ArrayList<>();
List<String> envs = new ArrayList<>();
List<String> destination = null;
for (String arg : args) {
if ("-app".equals(arg)) {
destination = apps;
} else if ("-env".equals(arg)) {
destination = envs;
} else if (destination == null) {
System.out.printf("Invalid argument: %s%n", arg);
} else {
destination.add(arg);
}
}
}
publicstaticvoidmain(字符串[]args){
列表应用程序=新建ArrayList();
List envs=new ArrayList();
列表目的地=null;
for(字符串arg:args){
如果(“-app.”等于(arg)){
目的地=应用程序;
}如果(“-env”.equals(arg)){
目的地=环境;
}else if(destination==null){
System.out.printf(“无效参数:%s%n”,arg);
}否则{
目的地。添加(arg);
}
}
}
我不明白为什么您忽略了这个解决方案,因为它正是您想要的(当时,出于某种奇怪的原因,您正在询问如何将字符串拆分为数组)
您可以这样做:
public static void main(String[] args) {
List<Application> apps = new ArrayList<>();
List<Environment> envs = new ArrayList<>();
boolean appFlag = false;
boolean envFlag = false;
for (String arg : args) {
if ("-app".equals(arg)) {
appFlag = true;
envFlag = false;
} else if ("-env".equals(arg)) {
envFlag = true;
appFlag = false;
} else if (appFlag) {
apps.add(Application.valueOf(arg));
} else if (envFlag) {
envs.add(Environment.valueOf(arg));
} else {
System.out.printf("Invalid argument: %s%n", arg);
}
}
Application.chooseAppTest(apps, envs);
}
publicstaticvoidmain(字符串[]args){
列表应用程序=新建ArrayList();
List envs=new ArrayList();
布尔appFlag=false;
布尔envFlag=false;
for(字符串arg:args){
如果(“-app.”等于(arg)){
appFlag=true;
envFlag=false;
}如果(“-env”.equals(arg)){
envFlag=true;
appFlag=false;
}else if(appFlag){
apps.add(Application.valueOf(arg));
}else if(环境标志){
环境添加(环境值(arg));
}否则{
System.out.printf(“无效参数:%s%n”,arg);
}
}
应用程序。选择应用程序测试(应用程序、环境);
}
以下是我应该做的:
1.创建枚举-您要添加的任何其他参数都应添加到此列表中
enum Args {
ENV("-env"),
APP("-app"),
NONE("");
String argCode;
/**
* @return the argCode
*/
public String getArgCode() {
return argCode;
}
Args(String argCode){
this.argCode = argCode;
}
/**
* @param str
* @return
*/
public static Args getArgs(String str){
for (Args arg : Args.values()){
if (arg.getArgCode().equalsIgnoreCase(str)){
return arg;
}
}
return NONE;
}
}
2.现在运行以下命令-这些行来准备一个映射,参数名作为键,其值作为值列表
public static void main(String[] args) {
HashMap <String, ArrayList<String>> argMap = new HashMap<String, ArrayList<String>>();
String argCode = null;
for (String arg: args){
Args a = Args.getArgs(arg);
if (!a.equals(Args.NONE)){
argCode = a.getArgCode();
continue;
}
ArrayList<String> argList = argMap.get(argCode);
if (argList == null){
argList = new ArrayList<String>();
argMap.put(argCode, argList);
}
argList.add(arg);
}
System.out.println(argMap.toString());
}
地图也会有这个键值对
以下内容也将起作用:
C:\Programs\eclipse\workspace\_TEST>java -cp ./bin Test006 -app a1 a2 -env e1 e2
6
---->-env
///e1
///e2
---->-app
///a1
///a2
C:\Programs\eclipse\workspace\_TEST>java -cp ./bin Test006 -env e1 e2 -app a1 a2
6
---->-env
///e1
///e2
---->-app
///a1
///a2
C:\Programs\eclipse\workspace\_TEST>
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
// this method does all the work
static private String[] getArgs(String argArray[],String indicator){
String arguments="";
for (String s: argArray){
arguments = arguments + s +" ";
}
arguments = arguments.trim();
Pattern p = Pattern.compile(indicator+" ([^\\-]*)");
Matcher m = p.matcher(arguments);
String[] newArgs={};
try {
m.find();
newArgs = m.group(1).split(" ");
} catch (IllegalStateException e){
}
return newArgs;
}
public static void main (String args[]){
System.out.println("ENVS");
String[] e=getArgs(args,"-env");
for (String s: e){
System.out.println(s);
}
System.out.println("APPS");
e=getArgs(args,"-app");
for (String s: e){
System.out.println(s);
}
}
}
-环境环境1-应用程序app1-环境环境2-应用程序app2
如果您不想让上述方法起作用,请检查main方法中的键是否重复。希望答案有帮助。此解决方案是可扩展的,因为它没有进行共享编码:
C:\Programs\eclipse\workspace\_TEST>java -cp ./bin Test006 -app a1 a2 -env e1 e2
6
---->-env
///e1
///e2
---->-app
///a1
///a2
C:\Programs\eclipse\workspace\_TEST>java -cp ./bin Test006 -env e1 e2 -app a1 a2
6
---->-env
///e1
///e2
---->-app
///a1
///a2
C:\Programs\eclipse\workspace\_TEST>
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
// this method does all the work
static private String[] getArgs(String argArray[],String indicator){
String arguments="";
for (String s: argArray){
arguments = arguments + s +" ";
}
arguments = arguments.trim();
Pattern p = Pattern.compile(indicator+" ([^\\-]*)");
Matcher m = p.matcher(arguments);
String[] newArgs={};
try {
m.find();
newArgs = m.group(1).split(" ");
} catch (IllegalStateException e){
}
return newArgs;
}
public static void main (String args[]){
System.out.println("ENVS");
String[] e=getArgs(args,"-env");
for (String s: e){
System.out.println(s);
}
System.out.println("APPS");
e=getArgs(args,"-app");
for (String s: e){
System.out.println(s);
}
}
}
示例输出:
java Main -env env1 env2 env3 -app app1 app2
ENVS
env1
env2
APPS
app1
app2
java Main -app app1 app2 app3 app4 -env env1 env2
ENVS
env1
env2
APPS
app1
app2
app3
app4
java Main -app app1 app2
ENVS
APPS
app1
app2
为什么不使用库呢?JOpt、Commons CLI、JCommander、Args4j……这些库中的大多数都可以提供您所需要的现成功能。我发现了一个相当长的命令行参数解析器列表:@RobbyCornelissen我的经理告诉我(我只是一名实习生)通常使用库会更好,但现在使用它会使运行库变得更复杂。我知道这听起来很愚蠢,但我应该在这里重新发明方向盘。我没有忽视它们。显然,它们并不像我也需要它们那样工作。我保证我试过人们给我的东西,我试着调整它们以满足我的需要。我我被问到关于拆分字符串的问题,因为这是我最初被要求做这项任务的方式。如果你能从一开始就这样帮助我,那就不会是一个问题。谢谢。