Tag: hashset

告诉HashSet如何对数据进行排序

我正在尝试创建一个HashSet(或任何集合类型 – 但我认为HashSet最适合我),无论插入什么,它都将保持有序。 这是我正在进行的联系经理项目。 我一直在试验,下面的例子。 import java.util.*; public class TestDriver{ public static void main(String[] args) { FullName person1 = new FullName(“Stephen”, “Harper”); FullName person2 = new FullName(“Jason”, “Kenney”); FullName person3 = new FullName(“Peter”, “MacKay”); FullName person4 = new FullName(“Rona”, “Ambrose”); FullName person5 = new FullName(“Rona”, “Aabrose”); HashSet names = new HashSet(); names.add(person3); names.add(person1); names.add(person4); names.add(person2); […]

具有自定义相等标准的Java HashSet?

我正在寻找类似于Java TreeSet在实例化时接收自定义比较器的能力,所以我不需要使用对象的默认相等(和哈希码)标准。 我能想到的最接近的是将我的对象包装在一个私有的自定义类中,但这看起来很糟糕:(这在编程时最终会成为一种反复出现的主题,所以我想知道是否已有可供我们使用的东西。也许在公共图书馆? 谢谢

将具有相同值的数组添加到HashSet会导致重复项

我正在尝试创建一组int的数组,问题是如果我尝试这样做: HashSet s = new HashSet(); int a1[] = {1,2,3}; int a2[] = {1,2,3}; s.add(a1); s.add(a2) System.out.println(s.size()); 然后s有两个对象,但应该只有一个。 注意:如果它是HashSet 则无关紧要。 它只是不起作用。 现在,如果我尝试使用ArrayList 执行此操作,请执行以下操作: HashSet<ArrayList> s = new HashSet<ArrayList>(); ArrayList a1 = new ArrayList(); ArrayList a2 = new ArrayList(); a1.add(1); a1.add(2); a1.add(3); a2.add(1); a2.add(2); a2.add(3); s.add(a1); s.add(a2) System.out.println(s.size()); 然后s有一个对象。 我虽然有办法避免第一个代码中的错误,并将每个数组的哈希码存储在一个hashset中,如下所示: int a1[] = {0,10083,10084,1,0,1,10083,0,0,0,0}; int a2[] […]

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

我有一个带有一堆Integers的HashSet 。 我想把它变成一个数组,但是要调用 hashset.toArray(); 返回一个Object[] 。 除了手动迭代每个元素之外,还有更好的方法将它转换为int数组吗? 我想将数组传递给 void doSomething(int[] arr) 它不会接受Object []数组,即使我尝试像它一样 doSomething((int[]) hashSet.toArray());

HashSet似乎没有意识到两个对象是相同的。

我正在尝试使用HashSet来存储我创建的类的对象,但显然相同的对象似乎有两个不同的哈希值,这就是为什么contains方法没有意识到该对象已经在HashSet中。 这导致我的程序耗尽堆内存。 我不认为我做错了什么,但无论如何我想要第二意见。 我做过类似的操作,之前一切正常,这使得这特别烦人。 我很感激任何帮助。 这是我的代码 move1 = new Move(t,s); if(move1.hashCode()==new Move(t,s).hashCode()) System.out.println(“match”); move2 = new Move(s,t); moves.add(move1); moves.add(move2); if(moves.contains(new Move(t,s))) System.out.println(“match found”); 这是Move类: public class Move { private int move1; private int move2; Move(int m1, int m2) { move1 = m1; move2 = m2; } public String toString() { return String.valueOf(move1)+” “+String.valueOf(move2); } } […]

Java HashSet中元素的排序

为什么第二组和第三组保留顺序: Integer[] j = new Integer[]{3,4,5,6,7,8,9}; LinkedHashSet i = new LinkedHashSet(); Collections.addAll(i,j); System.out.println(i); HashSet hi = new HashSet(i); System.out.println(hi); LinkedHashSet o = new LinkedHashSet(hi); System.out.println(o); 这是我得到的输出: 3,4,5,6,7,8,9 3,4,5,6,7,8,9 3,4,5,6,7,8,9

HashSet的迭代顺序

如果添加到java.util.HashSet的每个对象都以确定的方式实现Object.equals()和Object.hashCode(),则对于添加的每个相同元素集,HashSet上的迭代顺序保证相同, 而不管他们被加入的顺序? 奖金问题:如果插入顺序相同怎么办? (假设Sun JDK6具有相同的HashSet初始化。) 编辑:我原来的问题不明确。 它不是关于HashSet的一般契约,而是Sun在JDK6中实现的HashSet作为有关确定性的保证。 它本质上是非确定性的吗? 什么影响其迭代器使用的顺序?

如果包含元素被修改,Java HashSet包含重复项

假设您有一个类,并且您创建了一个可以存储此类实例的HashSet。 如果您尝试添加相同的实例,则集合中只保留一个实例,这很好。 但是,如果在HashSet中有两个不同的实例,并且您获取一个并使其成为另一个的精确副本(通过复制字段),则HashSet将包含两个重复的实例。 以下代码演示了这一点: public static void main(String[] args) { HashSet set = new HashSet(); GraphEdge edge1 = new GraphEdge(1, “a”); GraphEdge edge2 = new GraphEdge(2, “b”); GraphEdge edge3 = new GraphEdge(3, “c”); set.add(edge1); set.add(edge2); set.add(edge3); edge2.setId(1); edge2.setName(“a”); for(GraphEdge edge: set) { System.out.println(edge.toString()); } if(edge2.equals(edge1)) { System.out.println(“Equals”); } else { System.out.println(“Not Equals”); } } public […]