It is best to return the structure:
class Parameter { public String Name; public int Number; public String Surname; } Parameter parseLine(string line) { Parameter p = new Parameter(); String[] parts = line.split("|"); if (parts.Length != 3) throw SomeSternFormatException(); p.Name = GetValue(parts[0], "NAME"); p.Number = Integer.parseInt(GetValue(parts[1], "NUMBER")); p.Surname = GetValue(parts[2], "SURNAME"); return p; } String getValue(String input, String expectedKey) { String[] parts = input.split(":"); if (parts.Length != 2) throw SomeSternFormatException(); String key = parts[0].Trim(); if (!expectedKey.equals(key)) throw SomeSternFormatException(); return parts[1].Trim(); }
(This code comes from a strictly defined order and number of parts.)
For a case of arbitrary order, I would do something like this:
Parameter parseLine(string line) { Parameter p = new Parameter(); String[] parts = line.split("|"); HashMap<String, String> argmap = new HashMap<String, String>(); foreach (String part : parts) { String[] keyvalue = getKeyValue(part); String key = keyvalue[0]; if (argmap.containsKey(key)) throw SomeSternFormatException(); argmap.put(key, value); } if (argmap.size() != 3) throw SomeSternFormatException(); p.Name = argmap["NAME"]; p.Number = Integer.parseInt(argmap["NUMBER"]); p.Surname = argmap["SURNAME"]; return p; } String[] getKeyValue(String input) { String[] parts = input.split(":"); if (parts.Length != 2) throw SomeSternFormatException(); parts[0] = parts[0].Trim(); parts[1] = parts[1].Trim(); return parts; }
Exceptions let, by the way, the caller catches.