标签: hashset

为什么我不能在没有枚举的情况下从HashSet中检索项目?

我正在寻找洞察HashSet设计师的头脑.据我所知,我的问题适用于Java和C#HashSets,让我觉得必须有一些很好的理由,尽管我自己也想不到.

在我将项目插入HashSet之后,为什么在没有枚举的情况下检索该项目是不可能的,几乎不是有效的操作?特别是因为HashSet以支持有效检索的方式显式构建.

使用Remove(x)和Contains(x)返回正在删除或包含的实际项目通常很有用.这不一定是我传递给Remove(x)或Contains(x)函数的项目.当然,我想我可以通过HashMap实现同样的效果,但是为什么在完全有可能用套装完成时却浪费了所有的空间和努力?

我可以理解,可能存在一些设计问题,即添加此功能将允许使用HashSet,这与其角色或框架中的未来角色不一致,但如果是这样,那么这些设计问题是什么?

编辑

要回答更多问题,请参阅以下详细信息:

我使用带有重写的hashcode,equals等的不可变引用类型来模拟C#中的值类型.假设类型有成员A,B和C.Hashcode,equals等仅依赖于A和B.给定A和BI希望能够从hashset中检索该等效项并得到它C.我赢了它似乎可以使用HashSet,但我至少想知道这是否有任何充分的理由.伪代码如下:

public sealed class X{
 object A;
 object B;
 object extra;

 public int HashCode(){
  return A.hashCode() + B.hashCode();
 }

 public bool Equals(X obj){
  return obj.A == A && obj.B == B;
 }
}

hashset.insert(new X(1,2, extra1));
hashset.contains(new X(1,2)); //returns true, but I can't retrieve extra
Run Code Online (Sandbox Code Playgroud)

c# java hashset

33
推荐指数
2
解决办法
3万
查看次数

33
推荐指数
2
解决办法
3万
查看次数

HashSet与ArrayList包含性能

处理大量数据时,我经常发现自己在做以下事情:

HashSet<String> set = new HashSet<String> ();
//Adding elements to the set
ArrayList<String> list = new ArrayList<String> (set);
Run Code Online (Sandbox Code Playgroud)

类似于"转储"列表中集的内容.我通常这样做,因为我添加的元素通常包含我要删除的重复项,这似乎是一种删除它们的简单方法.

只考虑到这个目标(避免重复),我也可以写:

ArrayList<String> list = new ArrayList<String> ();
// Processing here
if (! list.contains(element)) list.add(element);
//More processing here
Run Code Online (Sandbox Code Playgroud)

因此无需将该集"转储"到列表中.但是,在插入每个元素之前我会做一个小的检查(我假设HashSet也这样做)

这两种可能性中的任何一种显然更有效吗?

java arraylist hashset

33
推荐指数
4
解决办法
3万
查看次数

.NET:如何有效地检查List <string>中50,000项的唯一性?

在某些库代码中,我有一个可以包含50,000个或更多项的List.

库的调用者可以调用导致字符串添加到列表的方法.如何有效地检查要添加的字符串的唯一性?

目前,在添加字符串之前,我扫描整个列表并将每个字符串与要添加的字符串进行比较.这开始显示超过10,000个项目的规模问题.

我将对此进行基准测试,但对洞察力感兴趣.

  • 如果我用List <>替换List <>,那么随着列表增长到10,000个项目以及更高,ContainsKey()会更快吗?
  • 如果我推迟了所有项目添加后的唯一性检查,它会更快吗?在那一点上,我需要检查每个元素与每个其他元素,仍然是一个n ^^ 2操作.

编辑

一些基本的基准结果.我创建了一个抽象类,它暴露了两种方法:Fill和Scan.填充只用n个项目填充集合(我用了50,000).扫描扫描列表m次(我使用5000)以查看是否存在给定值.然后我为List构建了该类的实现,为HashSet构建了另一个实现.

使用的字符串长度统一为11个字符,并通过抽象类中的方法随机生成.

一个非常基本的微观基准.

Hello from Cheeso.Tests.ListTester
filling 50000 items...
scanning 5000 items...
Time to fill: 00:00:00.4428266
Time to scan: 00:00:13.0291180

Hello from Cheeso.Tests.HashSetTester
filling 50000 items...
scanning 5000 items...
Time to fill: 00:00:00.3797751
Time to scan: 00:00:00.4364431
Run Code Online (Sandbox Code Playgroud)

因此,对于该长度的字符串,当扫描唯一性时,HashSet比List快大约25倍.此外,对于此大小的集合,在向集合添加项目时,HashSet对List没有任何惩罚.

结果很有趣,无效.为了获得有效的结果,我需要进行预热间隔,多次试验,随机选择实施.但我相信这只会略微改变这一点.

感谢大家.

EDIT2

在添加随机化和多重试验之后,HashSet在这种情况下始终优于List,大约20倍.

这些结果不一定适用于可变长度,更复杂对象或不同集合大小的字符串.

.net c# collections list hashset

32
推荐指数
3
解决办法
3662
查看次数

HashSet如何不允许重复?

我正在经历的add方法HashSet.有人提到

如果此set已包含该元素,则调用将保持set不变并返回false.

但是该add方法在内部保存了值HashMap

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
Run Code Online (Sandbox Code Playgroud)

陈述的put方法HashMap

将指定的值与此映射中的指定键相关联.如果映射先前包含键的映射,则替换旧值.

因此,如果该put方法HashMap取代了旧的值,该怎么办HashSet add法叶集重复的元素的情况下保持不变?

java hashmap hashset

32
推荐指数
3
解决办法
2万
查看次数

如何在.Net中实现ConcurrentHashSet

我试图在ConcurrentDictionary的精神中实现一个ConcurrentHashSet,采取的方法是使用内部支持ConcurrentDictionary并编写小的委托方法,这是我得到了多远,但很好的设置理论方法是我坚持,尤其是.我不确定我是否可以使用foreach并且仍然不违反并发性

public class ConcurrentHashSet<TElement> : ISet<TElement>
{
    private readonly ConcurrentDictionary<TElement, object> _internal;

    public ConcurrentHashSet(IEnumerable<TElement> elements = null)
    {
        _internal = new ConcurrentDictionary<TElement, object>();
        if (elements != null)
            UnionWith(elements);
    }

    public void UnionWith(IEnumerable<TElement> other)
    {
        if (other == null) throw new ArgumentNullException("other");

        foreach (var otherElement in other)
            Add(otherElement);
    }

    public void IntersectWith(IEnumerable<TElement> other)
    {
        throw new NotImplementedException();
    }

    public void ExceptWith(IEnumerable<TElement> other)
    {
        throw new NotImplementedException();
    }

    public void SymmetricExceptWith(IEnumerable<TElement> other)
    {
        throw new NotImplementedException();
    }

    public bool IsSubsetOf(IEnumerable<TElement> other)
    { …
Run Code Online (Sandbox Code Playgroud)

.net c# concurrency dictionary hashset

31
推荐指数
3
解决办法
2万
查看次数

如何在C#中将List <T>转换为HashSet <T>?

我有一个具有重复对象的List.要解决这个问题,我需要将List转换为HashSet(在C#中).有谁知道怎么样?

c# list hashset

31
推荐指数
3
解决办法
4万
查看次数

如何将Java HashSet <Integer>转换为原始int数组?

HashSet<Integer>有一堆里面的Integers东西.我想把它变成一个数组,但是调用

hashset.toArray();
Run Code Online (Sandbox Code Playgroud)

返回一个Object[].int除了手动迭代每个元素之外,有没有更好的方法将其强制转换为数组?我想将数组传递给

void doSomething(int[] arr)
Run Code Online (Sandbox Code Playgroud)

它不会接受Object []数组,即使我尝试像它一样

doSomething((int[]) hashSet.toArray());
Run Code Online (Sandbox Code Playgroud)

java arrays int hashset

29
推荐指数
5
解决办法
6万
查看次数

Java所有确定元素在列表中是相同的

我试图确定列表中的所有元素是否相同.如:

(10,10,10,10,10) --> true
(10,10,20,30,30) --> false
Run Code Online (Sandbox Code Playgroud)

我知道hashset可能会有所帮助,但我不知道如何用java编写.

这是我尝试过的,但没有用:

public static boolean allElementsTheSame(List<String> templist) 
{

    boolean flag = true;
    String first = templist.get(0);

    for (int i = 1; i< templist.size() && flag; i++)
    {
        if(templist.get(i) != first) flag = false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

java list brute-force hashset

28
推荐指数
3
解决办法
3万
查看次数

是Java HashSet线程安全的只读?

如果我在通过Collections.unmodifiableSet()运行它后有一个HashSet实例,它是否是线程安全的?

我问这个,因为Set文档声明它不是,但我只是执行读操作.

java concurrency hashset

27
推荐指数
4
解决办法
3万
查看次数

标签 统计

hashset ×10

java ×6

c# ×4

.net ×3

list ×3

arrays ×2

concurrency ×2

arraylist ×1

brute-force ×1

collections ×1

dictionary ×1

hashmap ×1

int ×1