Java 集合集合中的唯一集合
我有Java 集合集合中的唯一集合,java,algorithm,collections,set,Java,Algorithm,Collections,Set,我有int对,即;(int,int) 1) 给定k个这样的对,检查它们是否唯一。即;使用k对形成的集合的大小为k? 2) 如果给定的k条记录是唯一的,则按排序顺序存储它们(按x,按y解决冲突) 3) 给定n个大小为k的集合,创建一组集合 要求1和2的示例 如果k=3 (100100)(110300)(120200)是一个有效集,并按排序顺序排列。 (100100)(300200)(200300)是一个有效集,但不是按排序顺序排列的。 (100100)(100200)(100200)在有效集合中
int
对,即;(int,int)
1) 给定k个这样的对,检查它们是否唯一。即;使用k对形成的集合的大小为k?2) 如果给定的k条记录是唯一的,则按排序顺序存储它们(按x,按y解决冲突)
3) 给定n个大小为k的集合,创建一组集合 要求1和2的示例
如果k=3 (100100)(110300)(120200)是一个有效集,并按排序顺序排列。
(100100)(300200)(200300)是一个有效集,但不是按排序顺序排列的。
(100100)(100200)(100200)在有效集合中 要求3的示例
输入: (100100)(200300)(300200)
(100100)(200300)(300200)
(100100)(201300)(300200) 输出: (100100)(200300)(300200)
(100100)(201300)(300200) 这是与我所面临的真正问题最接近的类比。我需要用Java来完成这项工作,我从来没有用过Java。我是一个中级C++程序员。 我可以通过一些难看的编码和排序来解1和2。
然而,我不能得到3。下面是我到目前为止可以得到的3。类对实现了comparable (poc代码)
import java.util.HashSet;
公共类集{
公共静态void main(字符串[]args){
HashSet s1=新的HashSet();
s1.添加(新的一对(10,10));
s1.添加(新的一对(10,10));
HashSet s2=新的HashSet();
s2.添加(新的一对(10,10));
s2.添加(新的一对(10,10));
HashSet s12=新的HashSet();
s12.添加(s1);s12.添加(s2);
用于(哈希集hs:s12){
用于(p:hs对){
System.out.println(“+p.toString());
}
}
}
}
看起来您没有重写Pair类中的equals
和/或hashCode
方法
例如,如果您的对类具有以下结构:
protected K value1;
protected V value2;
您应该实现equals
和hashCode
如下(示例):
是和否。我开始通过家庭作业问题来探索计算几何算法。在移动行扫描和其他算法之前,我想自己尝试一下,你的HashSet代码到底出了什么问题?它看起来还可以,执行或执行一些未检查的操作。第一个哈希集无法识别重复项。如果我必须检查(10,10)(10,10)是否使用唯一对生成了一组大小为2的对,则上面编写的代码不起作用。理想情况下,s1在插入配对2次后应该只有(10,10)。我需要知道如何使用custom compare()/equal使其成为排序集类似于HashSet的问题,HashSet应该是唯一HashSet的集合上述代码的输出应该是(10,10)(忽略k必须是2)但是它正在打印(10,10)(10,10)(10,10)(10,10)如何定义对?具体来说,它是否正确地实现了equals
和hashCode
?对实现了Compariable。我还没有弄清楚如何让它同时实现这两个/全部。即;可比较、相等、哈希代码。(基本上实现多个接口。在C++中,我会做多重继承,不确定java语法)我的主要担心是,我正在采取的方法有效吗?有更好的收藏品吗?看起来这是我错过的。但总的来说,有更好的方法来处理这个问题吗?我认为更好的方法是使用TreeSet而不是HashSet,因为您希望按排序顺序存储pair对象。在任何情况下,都必须实现equals和hashCode。。
protected K value1;
protected V value2;
public boolean equals(Object obj) {
if (!(obj instanceof Pair))
return false;
Pair that = (Pair)obj;
boolean result = true;
if (this.getValue1() != null)
result = this.getValue1().equals(that.getValue1());
else if (that.getValue1() != null)
result = that.getValue1().equals(this.getValue1());
if (this.getValue2() != null)
result = result && this.getValue2().equals(that.getValue2());
else if (that.getValue2() != null)
result = result && that.getValue2().equals(this.getValue2());
return result;
}
public int hashCode() {
int result = value1 != null ? value1.hashCode() : 0;
result = 31 * result + (value2 != null ? value2.hashCode() : 0);
return result;
}