0

我想维护一组具有两个主要属性的数据:1.我可以通过数字 ID 快速查找对象的存在,以及 2.我想对数据进行排序,但避免不必要的排序,因为它可能很慢。举一个更具体的例子,我有一组用户数据,其中每个用户都有一个唯一的 ID(一个 int)和一个唯一的用户名(一个 String)。我将添加和删除用户,有时我想为用户生成一个人类可读的、按字母排序的列表,但是随着用户数量的增加,对数据进行排序所需的时间也会增加。

你会如何构建这个?我能想到的唯一合理的方法是创建两个单独的数据结构,并同时向两个结构冗余地添加/删除项目。随着我的数据增长,它将使用比单个结构更多的数据。我也可能以这种方式引入更多错误,因为当我稍后回来添加代码时,我必须提醒自己将操作复制到两个结构中。换句话说,我可以:

TreeMap<String,Integer> nameSortedMap = new TreeMap<String,Integer>(String.CASE_INSENSITIVE_ORDER);

Map<Integer,String> idMap = new HashMap<Integer,String>();

每当我添加或删除数据时,我都会在两张地图上进行。如果我按 ID 检索用户名,我会调用 idMap.get(id) 或 idMap.contains(id) (查看用户是否存在)。另一方面,如果我需要显示排序列表,我会使用 nameSortedMap.keySet(),我收集的它应该已经按名称顺序排列,避免每次需要排序列表时都需要额外的工作。

我的思考过程是怎样的?有没有更好或更简单的方法来实现这一点?谢谢!

4

2 回答 2

3

我能想到的方法有两种:

  • 使用数据库并索引两列。数据库速度很快,而且可能非常小(请参阅:SQLite),但如果您不需要保存数据,或者如果这是您唯一会使用它的用途,它们可能会过度使用。
  • 创建一个包含上面两个地图的类,它处理所有插入和删除。这样一来,您只有一个地方需要记住对两个地方都进行操作。这是面向对象编程的主要卖点之一。
于 2013-06-12T04:21:06.917 回答
0

如果您不经常调用有序列表,我认为没有必要保留两张地图,但如果您更愿意这样做。我建议您创建一个类来扩展 HashMap 并实现处理这两个映射的方法。例子:

public class UserMap extends HashMap<Integer, String> {

    TreeMap<String, Integer> nameSortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);

    @Override
    public String put(Integer key, String value) {
        String put = super.put(key, value);
        nameSortedMap.put(value, key);
        return put;
    }

    @Override
    public String remove(Object key) {
        String toRemove = get(key);
        if (toRemove != null) {
            remove(key);
            getOrderedName().remove(toRemove);
        }
        return toRemove;
    }

    public Set<String> getSortedNames() {
        return nameSortedMap.keySet();
    }

}
于 2013-06-12T04:35:44.860 回答