HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

Parsing argument list specifying a player to be added

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
specifyingargumentaddedplayerparsinglist

Problem

I want to start off by saying sorry, I wasn't able to search for this problem as I couldn't exactly describe it myself.

I have a series of if-statements to account for each scenario. As you can see in the mammoth block of code below, I want arguments to come in any order. How, if possible, can I shorten this?

```
if(args[1].startsWith("u:") && args[2].startsWith("r:") && args[3].startsWith("l:")){ // u / r / l
Player p = player.getServer().getPlayer(args[1].split(":")[1]);
String r = args[2].split(":")[1];
String l = args[3].split(":")[1];
Config.addPlayer(p, r, l, player);
return true;
}else if(args[1].startsWith("r:") && args[2].startsWith("l:") && args[3].startsWith("u:")){ // r / l / u
Player p = player.getServer().getPlayer(args[3].split(":")[1]);
String r = args[1].split(":")[1];
String l = args[2].split(":")[1];
Config.addPlayer(p, r, l, player);
return true;
}else if(args[1].startsWith("l:") && args[2].startsWith("u:") && args[3].startsWith("r:")){ // l / u / r
Player p = player.getServer().getPlayer(args[2].split(":")[1]);
String r = args[3].split(":")[1];
String l = args[1].split(":")[1];
Config.addPlayer(p, r, l, player);
return true;
}else if(args[1].startsWith("u") && args[2].startsWith("l:") && args[3].startsWith("r:")){ // u / l / r
Player p = player.getServer().getPlayer(args[1].split(":")[1]);
String r = args[3].split(":")[1];
String l = args[2].split(":")[1];
Config.addPlayer(p, r, l, player);
return true;
}else if(args[1].startsWith("l:") && args[2].startsWith("r:") && args[3].startsWith("u:")){ // l / r / u
Player p = player.getServer().getPlayer(args[2].split(":")[1]);
String r = args[2].split(":")[1];
String l = args[1].split(":")[1];
Config.addPlayer(p, r, l, player);
return true;
}else if(args[1].startsWith("r:") && args[2].startsWith("u:") && args[3].startsWith("l:")){ // r / u / l
Player p = player.getServer().getPlayer(args[2].split(":

Solution

First of all, don't ever write code like this... you know it can be done better, so don't waste your time.

Moreover, you can be sure, you'll make some errors there, e.g., this looks wrong:

Player p = player.getServer().getPlayer(args[2].split(":")[1]);
String r = args[2].split(":")[1];


as you're using args[2] twice.

It's actually very trivial:

String[] inputs = {args[1], args[2], args[3]);
Arrays.sort(inputs);
if (inputs[0].startsWith("l:") && inputs[1].startsWith("r:") && inputs[2].startsWith("u:")) {
    Player p = player.getServer().getPlayer(inputs[2].split(":")[1]);
    String r = inputs[1].split(":")[1];
    String l = inputs[0].split(":")[1];
    Config.addPlayer(p, r, l, player);
    return true;
} else {
    return false;
}


A possibly even simpler alternative would be to go through the args and always fill the appropriate data slot (p, r, and l). After processing all three args, all slots must be filled, otherwise the input is wrong.

There's much more to say... e.g., your repetitive

args[2].split(":")[1]


should be replaced by a method. You also most probably don't want to allow args like l:12:34:567 (or you don't want to lose the part after the second colon), so don't use split.

Actually, I guess, you need some command line parser... there are at least 10 such things in Java freely available.

Code Snippets

Player p = player.getServer().getPlayer(args[2].split(":")[1]);
String r = args[2].split(":")[1];
String[] inputs = {args[1], args[2], args[3]);
Arrays.sort(inputs);
if (inputs[0].startsWith("l:") && inputs[1].startsWith("r:") && inputs[2].startsWith("u:")) {
    Player p = player.getServer().getPlayer(inputs[2].split(":")[1]);
    String r = inputs[1].split(":")[1];
    String l = inputs[0].split(":")[1];
    Config.addPlayer(p, r, l, player);
    return true;
} else {
    return false;
}
args[2].split(":")[1]

Context

StackExchange Code Review Q#69804, answer score: 5

Revisions (0)

No revisions yet.