首先我使用Java来编写它。 所以我有一个带有这样的键和值的Map。
Key = Value
"a.1" = "a1"
"a.2" = "a2"
"a.3" = "a3"
"b.1" = "b1"
"b.2" = "b2"
"b.3" = "b3"
"c.1" = "c1"
"c.2" = "c2"
"c.3" = "c3"
我需要做的是让它全部拆分并制作,以便最终我可以使用
循环并创建新对象someloop{
new someObject(a1,b1,c1); // new someObject(a2,b2,c2); // new someObject(a3,b3,c3);
}
我需要能够使其动态化,以便我可以添加另一个前缀(d,e),并检查数字是否丢失或被跳过。
答案 0 :(得分:1)
我省略了输入验证:
public static void buildObjects(Map<String, String> keyValuePairs) {
List<List<String>> sortedValues = new ArrayList<>();
// assuming keys are ending in a digit 1 through 9, add empty lists to sortedValues to hold values
sortedValues.add(null); // index 0
for (int index = 0; index <= 9; index++) {
sortedValues.add(new ArrayList<>());
}
for (Map.Entry<String, String> pair : keyValuePairs.entrySet()) {
String key = pair.getKey();
int indexOfDot = key.indexOf('.');
int suffix = Integer.parseInt(key.substring(indexOfDot + 1));
sortedValues.get(suffix).add(pair.getValue());
}
for (List<String> list : sortedValues) {
if (list != null && ! list.isEmpty()) {
new SomeObject(list.toArray(new String[list.size()]));
}
}
}
您可能还想添加对创建的对象执行某些操作的代码。
如果您想确定传递给构造函数的值的顺序,可以使用new TreeMap(keyValuePairs)
甚至new TreeMap(yourComparator).putAll(keyValuePairs)
。这将控制密钥的处理顺序。
答案 1 :(得分:1)
如果更改SomeObject的构造函数以接受字符串列表,则可能有效:
Map<String, String> map = new HashMap<>();
map.put("a.1", "a1");
map.put("a.2", "a2");
map.put("a.3", "a3");
map.put("b.1", "b1");
map.put("b.2", "b2");
map.put("b.3", "b3");
map.put("c.1", "c1");
map.put("c.2", "c2");
map.put("c.3", "c3");
Map<String, List<String>> grouped = map.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry::getKey))
.collect(Collectors.groupingBy(
entry -> entry.getKey().split("\\.")[0],
HashMap::new,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
List<SomeObject> objects = grouped.values().stream().map(SomeObject::new).collect(Collectors.toList());
System.out.println(objects);