如何在 Java 中转换此结构? (都是请求参数,所以param:value都是字符串)
"country[0].town[11].name"="London"
"country[0].town[2].name"="Slough"
"country[2].town[3].name"="New York"
"country[3].name"="UK"
按顺序排列,没有间隙,如下所示:
"country[0].town[1].name"="London"
"country[0].town[0].name"="Slough"
"country[1].town[0].name"="New York"
"country[2].name"="UK"
这个想法是所有国家/地区数组元素都来自 [0..x],没有间隙。那么在每个国家,相同的规则应该适用于城镇。
我可以按字母数字顺序对这些参数的列表进行排序,因此可以假设它们已排序
我可能需要这个的原因:我可以以 html 形式创建/删除国家对象和城镇。如果我创建 2 个国家/地区,然后删除剩余国家/地区的第一个输入参数(索引),因为 0 被删除,所以剩余国家/地区的第一个输入参数(索引)将为 1。当它到达服务器端时,该国家/地区将被映射到列表索引 1,并且对于第一个(索引),它会创建空的国家/地区对象。它给我带来了问题,我认为我可以重新排列输入参数的顺序,这样我就可以避免从请求自动绑定(bind)“空白”列表项。
我如何生成输入:
当我删除城镇时,我也会删除输入。因此,当我提交表单时,请求参数中的任何内容都会绑定(bind)到 java 对象结构,而缺少的内容将使用默认构造函数的元素进行填充。
最佳答案
我想我会尝试使用正则表达式找到一个解决方案,因为我对它们非常糟糕。如果您首先按词汇顺序对它们进行排序,那么这将起作用,前提是您没有任何没有名称的国家/地区。
public class RegexCountryParser {
private static final Pattern townPattern = Pattern
.compile("country\\[\\d*\\]\\.town\\[\\d*\\]\\.name");
private static final Pattern countryPattern = Pattern.compile("country\\[\\d*\\]\\.name");
private List<Country> countries = new ArrayList<>();
public void parse(String param, String value) {
Matcher countryMatcher = countryPattern.matcher(param);
Matcher townMatcher = townPattern.matcher(param);
if (countryMatcher.matches()) {
countries.add(new Country(value));
} else if (townMatcher.matches()) {
countries.get(countries.size() - 1).addTown(new Town(value));
} else {
throw new IllegalArgumentException("Invalid request parameter");
}
}
}
public class Country {
private String name;
private List<Town> towns;
public Country(String name) {
this.name = name;
this.towns = new ArrayList<>();
}
public void addTown(Town town) {
towns.add(town);
}
@Override
public String toString() {
return name + ": " + towns;
}
}
public class Town {
private String name;
public Town(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
直到我开始测试这个,我才意识到你把country
拼写错误了。另外,这只是我的挑剔,但我讨厌看到具有非复数名称的列表。
关于java - 从字符串中的 0 开始重新索引数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20364194/