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);