java - 从字符串中的 0 开始重新索引数组

标签 java

如何在 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/

相关文章:

java - Map Reduce代码用于计算下降率

java - 游戏架构和状态设计

JavaFX 库 - 尝试添加未提供的属性

java - Java 中 HashMap 的克隆实用程序

java - 如何在 Magnolia CMS (v 5.5.6) 中为 jax-rs 端点提供自定义异常映射?

java - 用 javac 编译并将 double 转换为 float

java - Graphics2D 不在 Canvas 上绘制

java - Eclipse 中的包资源管理器发生了什么变化?

java - 流口水功能

java - 如何在 JavaFX 中单击的选项卡上隐藏 TabPane 内容