我有A班的名单

public class A {
    String port;
    String ip;
    String name;
    Obeject ...others;
}


在此列表中,我想找到共享相同IP和端口的重复元素。


覆盖equals()来比较ip和port并使用hashSet可能是解决此问题的一种方法。但是我认为equals()不应被覆盖,因为此类中还有其他字段,可能会使逻辑混乱。
使用TreeSet并实现Comparator是另一种方法。但是ip和ports很难比较,因为我们有ipv6,ipv4,ip范围,端口范围等,所以比较大。在compare()中,如果仅在ip和port相等时返回0,而在不相等时返回1则将导致逻辑错误。因为TreeSet是由红黑树实现的。
带有重载equals()的称为AHelper的子类可能会起作用。但是我认为这很愚蠢。


还有其他方法可以解决这个问题吗? ~~~非常感谢。

最佳答案

声明一个仅包含IpAndPortip字段的新类port,并对该类覆盖equals()以便比较两个字段。定义一个Map,其键为IpAndPort,其值可以为AList<A>,具体取决于您的需求。遍历List<A>,并为每个元素创建IpAndPort。现在,将其添加到以IpAndPort为键的地图中,或者(1)将A作为值添加到地图中;或(2)为A中的每个键收集映射中的所有List<A>。或其他方法(您可以将其设置为Map<IpAndPort, Integer>,仅计算每个IP /端口密钥的值数量)。

您还可以通过将IpAndPort对象作为A中的实例变量,替换ipport变量来消除一点冗余。

09-13 07:02