java中的复杂集合
我需要使用以下访问方法定义用户定义对象的集合:java中的复杂集合,java,collections,Java,Collections,我需要使用以下访问方法定义用户定义对象的集合: 通过对象的主键进行访问(唯一) 按索引访问按辅助键排序的集合(非唯一) 每个对象都有一个主键和一个辅助键(不保证唯一)。将对象添加到集合时,应将其插入到某个位置,以便对次关键字值进行排序。 应使用主键或集合中的位置提取或删除每个对象 实现此集合的最佳方式是什么? (主键和对象的映射将提供一半访问权限,排序列表将提供另一半访问权限。如何根据我的要求组合这些内容?) (主键和对象的映射将提供一半访问权限,排序列表将提供另一半访问权限。如何根据我的要求组
(主键和对象的映射将提供一半访问权限,排序列表将提供另一半访问权限。如何根据我的要求组合这些内容?)
(主键和对象的映射将提供一半访问权限,排序列表将提供另一半访问权限。如何根据我的要求组合这些内容?)
公共类集合{
私人地图;
私人名单;
公共void添加(userobjectobj){
yourMap.put(obj.primaryKey,obj);
添加(obj);
//secondaryKey上的排序列表
}
公共用户对象获取(字符串键){
返回地图。获取(键);
}
公共用户对象get(int索引){
返回列表。获取(索引);
}
}
这只是基本的外壳,但想法就在那里。选择哪种类型的列表和哪种类型的地图取决于您。您还可以/应该向该类添加泛型
编辑-而且,对于给定的问题没有最佳的解决方法。你必须考虑不同方法的利弊,并权衡它们与你的目标。例如,您是否需要此文件来占用最少的内存?您需要它使用最少的CPU周期吗?您是否需要它成为最容易编写和维护的代码?或者你只是想把有用的东西组合起来?实际上,我并不是要你回答这些问题,但你在思考这类问题时应该考虑这些问题。你可以很容易地自己编写这样一个集合,其中你有一个(普通的)
HashMap
值的主键,然后是另一个PriorityQueue
的主键对(因为主键并不总是唯一的,所以不能使用Map
类型)
解决方案:
下面是一个完整的工作示例:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
public class MyCollection<T, TPrimaryKey, TSecondaryKey extends Comparable<TSecondaryKey>> {
private HashMap<TPrimaryKey, T> primaryKeyMap;
private List<PrimarySecondaryKeyPair> primarySecondaryKeyList;
public MyCollection() {
primaryKeyMap = new HashMap<TPrimaryKey, T>();
primarySecondaryKeyList = new ArrayList<PrimarySecondaryKeyPair>();
}
public MyCollection(int initialCapacity) {
primaryKeyMap = new HashMap<TPrimaryKey, T>(initialCapacity);
primarySecondaryKeyList = new ArrayList<PrimarySecondaryKeyPair>(initialCapacity);
}
private class PrimarySecondaryKeyPair implements Comparable<PrimarySecondaryKeyPair> {
public TPrimaryKey primaryKey;
public TSecondaryKey secondaryKey;
public PrimarySecondaryKeyPair(TPrimaryKey primaryKey, TSecondaryKey secondaryKey) {
this.primaryKey = primaryKey;
this.secondaryKey = secondaryKey;
}
@Override
public int compareTo(MyCollection<T, TPrimaryKey, TSecondaryKey>.PrimarySecondaryKeyPair o) {
return secondaryKey.compareTo(o.secondaryKey);
}
}
public void put(T object, TPrimaryKey primaryKey, TSecondaryKey secondaryKey) { // put by primaryKey
primaryKeyMap.put(primaryKey, object);
PrimarySecondaryKeyPair keyPair = new PrimarySecondaryKeyPair(primaryKey, secondaryKey);
int insertionPoint = Collections.binarySearch(primarySecondaryKeyList, keyPair);
primarySecondaryKeyList.add((insertionPoint > -1) ? insertionPoint : (-insertionPoint) - 1, keyPair);
}
public T getByPrimaryKey(TPrimaryKey primaryKey) {
return primaryKeyMap.get(primaryKey);
}
public T getByIndex(int index) {
return getByPrimaryKey(primarySecondaryKeyList.get(index).primaryKey);
}
public void deleteByPrimaryKey(TPrimaryKey primaryKey) {
primaryKeyMap.remove(primaryKey);
for (int i = 0; i < primarySecondaryKeyList.size(); i++) {
if (primarySecondaryKeyList.get(i).primaryKey.equals(primaryKey)) {
primarySecondaryKeyList.remove(i);
}
}
}
public void deleteByIndex(int index) {
primaryKeyMap.remove(primarySecondaryKeyList.remove(index).primaryKey);
}
}
初始容量为50:
MyCollection<String, Long, Integer> myCollection = new MyCollection<String, Long, Integer>();
MyCollection<String, Long, Integer> myCollection = new MyCollection<String, Long, Integer>(50);
myCollection.put("hello", 937234L, 2);
。。。其他一切都应该不言自明;)
这应该符合您的要求和所需的收藏类型。
希望有帮助。:) 构建一个封装映射和集合的类?实现此集合的最佳方法是什么?开始编码。否则,就永远不会有一个
集合来满足您的需要=)“主键和对象的映射将提供一半的访问权限,而排序列表将提供另一半的访问权限。如何将它们结合起来满足我的要求?”为什么将它们作为一个对象是一个要求?这听起来像是一个解决方案。您看过实现SortedMap
的Java集合吗?复杂性要求是什么?这当然是一个很好的起点,值得研究所需的任何其他方法。如果我按某个对象的键删除该对象,我必须在列表中搜索,以确定要从列表中删除的正确对象。有没有“快速”的方法可以做到这一点?@DonaldAshton首先将其从地图中删除,然后返回该对象。然后从列表中删除该对象。谢谢您的回答。它是完整的,作为泛型类提供,并对其性能和操作进行了解释。@DonaldAshton如果我的回答对您有所帮助,并且您认为它是正确的,您可以:)。我以为我已登录,但“勾号”不在那里,因此我无法“接受”答案。我现在已经再次登录并完成了登录。
myCollection.put("hello", 937234L, 2);