如何HashSet<string>.Contains()在案例敏感模式下使用方法?
我有一个集合 - 一个HashSet我想从中删除一些项目......"removals"集合中的所有项目都不在原始集合中.
我在命令行中指定"source"集的大小和"removals"集合的大小,并构建它们.源集仅包含非负整数; 删除集仅包含负整数.我测量使用System.currentTimeMillis()移除所有元素所需的时间,这不是世界上最准确的秒表,但在这种情况下绰绰有余,正如您将看到的那样.这是代码:
import java.util.*;
public class Test
{
public static void main(String[] args)
{
int sourceSize = Integer.parseInt(args[0]);
int removalsSize = Integer.parseInt(args[1]);
Set<Integer> source = new HashSet<Integer>();
Collection<Integer> removals = new ArrayList<Integer>();
for (int i = 0; i < sourceSize; i++)
{
source.add(i);
}
for (int i = 1; i <= removalsSize; i++)
{
removals.add(-i);
}
long start = System.currentTimeMillis();
source.removeAll(removals);
long end = System.currentTimeMillis();
System.out.println("Time taken: " + (end - start) + "ms");
}
}
Run Code Online (Sandbox Code Playgroud)
让我们从一个简单的工作开始: …
我今天接受了采访,接受采访的人对他的陈述感到困惑,询问是否可能TreeSet等于HashSet但不HashSet等于TreeSet。我说“不”,但据他说,答案是“是”。
怎么可能?
我有HashSet参数的方法.我需要在其中做不区分大小写的包含:
public void DoSomething(HashSet<string> set, string item)
{
var x = set.Contains(item);
...
}
Run Code Online (Sandbox Code Playgroud)
是否可以使现有的HashSet不区分大小写(不创建新的)?
我正在寻找具有最佳性能的解决方案.
编辑
包含可以多次调用.因此,由于性能低于本机HashSet Contains方法,IEnumerable扩展对我来说是不可接受的.
解
既然,回答我的问题是NO,那是不可能的,我已经创建并使用了以下方法:
public HashSet<string> EnsureCaseInsensitive(HashSet<string> set)
{
return set.Comparer == StringComparer.OrdinalIgnoreCase
? set
: new HashSet<string>(set, StringComparer.OrdinalIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud) 我已经看到了有关Set根据索引值获取对象的其他问题,我理解为什么这是不可能的.但我无法找到一个很好的解释为什么不允许通过对象获取,所以我想问.
HashSetHashMap得到一个对象的支持应该非常简单.就像现在一样,似乎我必须遍历每个项目HashSet并测试相等,这似乎是不必要的.
我可以使用一个,Map但我不需要一个键:值对,我只需要一个Set.
比如说我有Foo.java:
package example;
import java.io.Serializable;
public class Foo implements Serializable {
String _id;
String _description;
public Foo(String id){
this._id = id
}
public void setDescription(String description){
this._description = description;
}
public String getDescription(){
return this._description;
}
public boolean equals(Object obj) {
//equals code, checks if id's are equal
}
public int hashCode() {
//hash code calculation
}
}
Run Code Online (Sandbox Code Playgroud)
并且Example.java:
package example;
import java.util.HashSet; …Run Code Online (Sandbox Code Playgroud) 我有几千个整数键的列表.我需要对此列表执行的唯一操作是说明给定值是否在列表中.
对于C#,我会用a HashSet来快速查找.什么是JavaScript等价物?
最低支持级别:IE 9 +,jQuery(当前)
根据Java in Set的合同,"不允许集合将自己包含为元素"(来源).但是,对于HashSet of Objects,这是可能的,如下所示:
Set<Object> mySet = new HashSet<>();
mySet.add(mySet);
assertThat(mySet.size(), equalTo(1));
Run Code Online (Sandbox Code Playgroud)
这个断言通过了,但我希望行为是将结果集合为0或抛出异常.我意识到HashSet的底层实现是一个HashMap,但似乎应该在添加元素之前进行相等检查以避免违反该合同,不是吗?
我试图确定HashSet.NET 3.5(C#)中的两个对象是否是相等的集合,即包含相同的值.这似乎是人们显然想做的事情,但是所提供的功能似乎都没有给你这些信息.
我能想到这样做的方法是检查两组的计数是否相等,一组是另一组的子集(不合适).我认为唯一可能发生的方法是它们是否相同.示例代码:
HashSet<int> set1 = new HashSet<int>();
set1.Add(1);
set1.Add(2);
set1.Add(3);
HashSet<int> set2 = new HashSet<int>();
set2.Add(1);
set2.Add(2);
set2.Add(3);
if(set1.Count == set2.Count && set1.IsSubsetOf(set2))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
这会一直有效吗?有没有更好的办法?为什么不HashSet具有 public bool IsEqualSetWith()的功能?
为什么我不能预先分配hashset<T>?
有时我可能会添加很多元素,我想消除调整大小.
hashset ×10
c# ×4
java ×4
.net ×3
collections ×3
set ×2
.net-3.5 ×1
contract ×1
javascript ×1
jquery ×1
performance ×1
string ×1
treeset ×1