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;
}