-1

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(":")[1]);
    String r = args[1].split(":")[1];
    String l = args[3].split(":")[1];
    Config.addPlayer(p, r, l, player);
    return true;
}
Spedwards
  • 4,167
  • 16
  • 49
  • 106

3 Answers3

4
Player p = null;
String r = null;
String l = null;

for (int i = 1; i <= 3; i++) {
  String[] components = args[i].split(":");
  switch(components[0]) {
    case "u":
      p = player.getServer().getPlayer(components[1]);
      break;
    case "r":
      r = components[1];
      break;
    case "l":
      l = components[1];
  }
}

if (p != null && r != null && l != null) {
  Config.addPlayer(p, r, l, player);
  return true;
}
Vijay Kansal
  • 809
  • 12
  • 26
0

I think you could copy the array with Arrays.copyOfRange(T[], int, int) and then sort it with Arrays.sort(Object[]). Something like,

String[] tmp = Arrays.copyOfRange(args, 1, args.length);
Arrays.sort(tmp);
if(tmp[0].startsWith("l:") && tmp[1].startsWith("r:")
        && tmp[2].startsWith("u:"))
{   /* l / r / u */
    Player p = player.getServer().getPlayer(tmp[2].split(":")[1]);
    String r = tmp[1].split(":")[1];
    String l = tmp[0].split(":")[1];
    Config.addPlayer(p, r, l, player);
    return true;
} 
Elliott Frisch
  • 198,278
  • 20
  • 158
  • 249
0

What you are looking for is called Chain of Responsibility pattern:

Since you don't show enough context of what this is actually supposed to be doing, I just named the classes and methods strawman names, use more contextual names.

And you will have to modify what is in the isValid() method maybe, but this is the general way to handle exploding if/elseif/else statements.

public static void main(String[] args)
{
    final List<Scenario> scenarios = new ArrayList<>();
    scenarios.add(new Scenario("u:", "r:", "l:"));
    scenarios.add(new Scenario("r:", "L:", "u:"));
    scenarios.add(new Scenario("l:", "u:", "r:"));

    for (final Scenario f : scenarios)
    {
        if (f.isValid(args)) { break; }
    }
}

public static class Scenario
{
    private final String arg1prefix;
    private final String arg2prefix;
    private final String arg3prefix;

    public Scenario(@Nonnull final String arg1prefix, @Nonnull final String arg2prefix, final String arg3prefix)
    {
        this.arg1prefix = arg1prefix;
        this.arg2prefix = arg2prefix;
        this.arg3prefix = arg3prefix;
    }

    public boolean isValid(@Nonnull final String... args)
    {
        if (args[1].startsWith(this.arg1prefix) && args[2].startsWith(this.arg2prefix) && args[3].startsWith(this.arg3prefix))
        {
            final Player p = player.getServer().getPlayer(args[1].split(":")[1]);
            final String r = args[2].split(":")[1];
            final String l = args[3].split(":")[1];
            Config.addPlayer(p, r, l, player);
            return true;
        }
        else
        {
            return false;
        }
    }
}
Community
  • 1
  • 1