0

如果出现以下情况,我应该使用什么方法将项目保存在列表中:

  1. 我有一个包含项目列表的对象,可以对这些项目执行操作
  2. 这些项目在列表中排序
  3. 我需要能够更改列表中项目的位置,并根据其 id 添加或删除项目。
  4. 该列表最终将保存到数据库中(并且项目需要在此列表中保持其顺序)
  5. 在已订购的项目上拥有属性“order”是没有意义的(这些对象可以在多种列表中)。

我有的选择(还有其他选择吗?):

  1. 使用 List 对象,这样它就会自动保持顺序。但是我必须遍历所有对象(更糟糕的是)才能通过 Id 找到对象。
  2. 使用带有键/值(对象 ID / 对象)的映射,因此很容易检索对象(并且快速)并保留另一个仅保持对象顺序的映射(对象 ID / 对象顺序)

解决方案 #1)这似乎是最简单的解决方案,但存在性能缺陷。

解决方案#2)这似乎是最快的解决方案,但在重新排序列表时代码更多。

是否有一个我不知道的对象将被订购,具有键/值对并具有像 object.add(index, key, value) 或 object.getByIndex(index) 或 object.getByKey(key) 这样的方法?

4

2 回答 2

1

正如Roni建议的那样,您需要使用自己的数据结构。我相信这是满足您要求的唯一可行选择。

我已经做了一个示例来填写您的要求starting point,您可以在此基础上进行构建。

public class MapAndList {

    private List<String> keys = new ArrayList<String>();
    private Map<String, Object> keyValuePair = new HashMap<String, Object>();

    public void addItem(String key, Object item) {
        // TODO if the key is already present in the list throw exception
        keys.add(key);
        keyValuePair.put(key, item);
    }

    public void removeItem(String key) {
        keys.remove(key);
        keyValuePair.remove(key);
    }

    public void removteItem(int index) {
        removeItem(keys.get(index));
    }

    public void addItem(String key, Object item, int index) {
        keys.add(index, key);
        keyValuePair.put(key, item);
    }

}

希望这可以帮助你....

于 2012-08-17T04:01:18.827 回答
0

如果您的项目不会重复,则使用 indexOf() 方法获取对象的索引,然后您可以使用 get(int Index) 直接访问对象

还覆盖 Item 对象的 equals 方法以返回基于 ID 的比较,因此您将获得基于 Id 的重试。

刚刚检查了 indexOf 方法的源代码,它只遍历整个列表:(

于 2012-08-17T03:50:23.937 回答