java - 如何构造可以在不同键上索引和排序的数据?

标签 java collections

我想维护一组具有两个主要属性的数据: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>();

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

我的思维过程如何?有没有更好或更简单的方法来实现这一点?谢谢!

最佳答案

我能想到的有两种方法:

  • 使用数据库并为两列建立索引。数据库速度很快,而且可能非常小(请参阅: SQLite ),但如果您不需要保存数据,或者这是您唯一使用它的用途,那么它们可能就太过分了。
  • 创建一个包含上述两个映射的类,用于处理所有插入和删除操作。这样,您就只有一个地方需要记住对两者进行操作。这是 object oriented programming 的主要卖点之一.

关于java - 如何构造可以在不同键上索引和排序的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17057585/

相关文章:

java - Mockito 声明方法被调用两次

java - Guava Immutable* 类是否满足它们实现的标准集合接口(interface)?

java - 按文档 ID 降序搜索 Lucene

Java运行时注解

java - LibGDX 3D 相机实现

java - 在java 8中将hashmap拆分为分区

java - Bean类与集合: which one should i prefer to hold data

.net - .NET 的 List(Of T).Reverse 方法的范围

data-structures - 来自现有集合与迭代的 Java ArrayDeque 实例化

java - 使用 Apache POI 在 .xls 文件中创建组合框?