Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 维护插入顺序并允许通过其索引访问元素的集合_C#_Java_Data Structures_Set - Fatal编程技术网

C# 维护插入顺序并允许通过其索引访问元素的集合

C# 维护插入顺序并允许通过其索引访问元素的集合,c#,java,data-structures,set,C#,Java,Data Structures,Set,我基本上需要一个像集合一样工作的数据结构,但它不仅可以维护插入顺序,因为稍后我们将通过get(index)方法获取插入顺序 最适合实现这一目标的数据结构是什么?如果需要的话,我不需要实施一个。在更糟糕的情况下,我可以同时使用ArrayList和HashSet,但我想知道是否有专门的数据结构来完成任务 性能是最重要的(否则我可以在常规列表上进行O(n)搜索!),而且我不太担心空间复杂性。那么有序字典如何 表示可由访问的键/值对的集合 键或索引 您是否愿意使用现有代码?ApacheCommons有一

我基本上需要一个像
集合
一样工作的数据结构,但它不仅可以维护插入顺序,因为稍后我们将通过
get(index)
方法获取插入顺序

最适合实现这一目标的数据结构是什么?如果需要的话,我不需要实施一个。在更糟糕的情况下,我可以同时使用ArrayList和HashSet,但我想知道是否有专门的数据结构来完成任务


性能是最重要的(否则我可以在常规列表上进行
O(n)
搜索!),而且我不太担心空间复杂性。

那么
有序字典如何

表示可由访问的键/值对的集合 键或索引


您是否愿意使用现有代码?ApacheCommons有一个类似乎适合您的所有需求。更糟糕的是,你可以研究源代码并用C实现。

类似的东西编辑:正如Jiddo所指出的,此结构无法有效删除元素。如果不需要高效的删除,ArrayList+Set会更简单,因此这种结构实际上没有多大用处

import java.util.*;

public class ArraySet<T> {
    private final Map<Integer, T> indexToElem;
    private final Map<T, Integer> elemToIndex;

    public ArraySet() {
        indexToElem = new HashMap<Integer, T>();
        elemToIndex = new HashMap<T, Integer>();
    }

    public T get(int index) {
        if (index < 0 || index >= size())
            throw new IndexOutOfBoundsException();
        return indexToElem.get(index);
    }

    public void add(T elem) {
        if (!contains(elem)) {
            int index = indexToElem.size();
            indexToElem.put(index, elem);
            elemToIndex.put(elem, index);
        }
    }

    // Doesn't work; see comment.
    /*public void remove(T elem) {
        int index = elemToIndex.get(elem);
        indexToElem.remove(index);
        elemToIndex.remove(elem);
    }*/

    public boolean contains(T elem) {
        return elemToIndex.containsKey(elem);
    }

    public int size() {
        return indexToElem.size();
    }
}
import java.util.*;
公共类数组集{
私人最终地图索引;
私人最终地图电子索引;
公共阵列集(){
indexToElem=newHashMap();
elemToIndex=newhashmap();
}
公共T获取(整数索引){
如果(索引<0 | |索引>=size())
抛出新的IndexOutOfBoundsException();
返回indexToElem.get(索引);
}
公共无效添加(T元素){
如果(!包含(元素)){
int index=indexToElem.size();
索引元素put(索引,元素);
元素索引put(元素,索引);
}
}
//不起作用;请参阅注释。
/*公共无效删除(T元素){
int index=elemToIndex.get(elem);
删除(索引);
elemToIndex.remove(elem);
}*/
公共布尔包含(T元素){
返回elemToIndex.containsKey(elem);
}
公共整数大小(){
返回indexToElem.size();
}
}

两种数据结构如何:一种是将索引映射到项的字典,另一种是项的hashmap。您需要C#或Java中的这种数据结构吗?Guava有,但我们找不到真正需要它的人。你介意在这里插入一些关于你的用例的细节吗?哦,这是一个旅行推销员问题的暴力实现,所以我承认这不是一个真正的标准场景。相关:啊。我不知道。这是算法的通用名称吗?@EnglumeDealysium我链接的特定名称是c#collection类型。我知道。但我担心的是找到一个现存的实现,就像知道后面使用的算法的名称一样(这是一门算法和数据结构研究生课程)。@Englusedelysium我不太确定。可以尝试一些谷歌搜索,看看和/或用反射器戳一下它的内脏,看看它是如何实现的。非通用!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!但是谢谢,似乎正是我想要的。我也来看看它的来源。很好。但这比集合+数组列表的组合好吗?我不明白如何有效地从数组列表中删除,移动其他元素不是需要线性预期时间吗?啊,忘记了那个小细节。请注意,使用建议的实现对除最后一个元素之外的任何元素执行删除操作都会有效地破坏集合。无法检索最后一个元素,下一个添加元素的索引将与最后一个元素冲突,并且可访问的索引将不再一致。如果不需要删除,那么它将很好地工作。@Jiddo很好,我忽略了这一点。这个答案可能不被接受。一个平衡的树,其中每个节点存储其后代计数,似乎是更好的方法。应该可以在对数时间内完成所有事情。