0

我正在开发一个 GWT(Google Web Toolkit)项目。我正在构建一个包含一系列列表框的“表单”。每个 ListBox 对应一个不同的 JSONArray,其中包含 JSONObjects。我希望每个 ListBox 在 JSONObjects 中保存一组排序的键/值对。我为每个 ListBox 一遍又一遍地重复相同的代码。我的问题是我可以参数化这个过程吗?

在我找到每个 JSONObject 的比较器之前,答案似乎很大程度上是“是”。Comparator 不带参数,我对 Java 的了解不够,不知道如何解决这个问题。可能吗?

private FlowPanel createWebUsersList(JSONArray Info, String listName) {
    FlowPanel panel = new FlowPanel();
    final ListBox listBox = new ListBox();

    panel.add(new HTML("<h3>Limit by " + listName + "</h3>"));

    listBox.setStyleName("LimitBy");
    listBox.setName("limitBy" + listName);
    listBox.setVisibleItemCount(20);
    panel.add(listBox);

    if (Info.size() > 0) {
        SortedSet<JSONObject> sortedList = Collections
                .synchronizedSortedSet(new TreeSet<JSONObject>(
                        new JSONObjectComparator(listName)));
        for (int i = 0; i < Info.size(); i++) {
            sortedList.add(Info.get(i).isObject());
        }

        while (sortedList.iterator().hasNext()) {
            JSONObject item = sortedList.iterator().next();
            listBox.addItem(
                    item.get("UserName").isString().stringValue(),
                    Integer.toString((int) item.get("ID").isNumber()
                            .doubleValue()));
        }
    } else {
        Misc.displayError(logger,
                "selectEMSEventsBy.addChangeHandler.onChange: empty WebUsers");
    }

    return panel;
}

class JSONObjectComparator implements Comparator<JSONObject> {

    @Override
    public int compare(JSONObject o1, JSONObject o2) {
        return o1
                .get("UserName")
                .isString()
                .stringValue()
                .compareToIgnoreCase(
                        o2.get("UserName").isString().stringValue());
    }
}
4

1 回答 1

0

我想这就是你的想法。构造函数接受一个字符串参数,其中包含要比较的字段的名称。

class JSONObjectComparator implements Comparator<JSONObject> {
    private String fieldToCompare = null;
    public JSONObjectComparator(String fieldToCompare) {
        this.fieldToCompare = fieldToCompare;
    }
    @Override
    public int compare(JSONObject o1, JSONObject o2) {
        return o1
                .get(fieldToCompare)
                .isString()
                .stringValue()
                .compareToIgnoreCase(
                        o2.get(fieldToCompare).isString().stringValue());
    }
}

请注意,如果字段不是字符串(isString()将返回null),您仍然会遇到 NPE 问题。但这是一个单独的问题,您可以自己解决。

于 2013-10-14T18:07:16.193 回答