我有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的子类可能会起作用。但是我认为这很愚蠢。
还有其他方法可以解决这个问题吗? ~~~非常感谢。
最佳答案
声明一个仅包含IpAndPort
和ip
字段的新类port
,并对该类覆盖equals()
以便比较两个字段。定义一个Map
,其键为IpAndPort
,其值可以为A
或List<A>
,具体取决于您的需求。遍历List<A>
,并为每个元素创建IpAndPort
。现在,将其添加到以IpAndPort
为键的地图中,或者(1)将A
作为值添加到地图中;或(2)为A
中的每个键收集映射中的所有List<A>
。或其他方法(您可以将其设置为Map<IpAndPort, Integer>
,仅计算每个IP /端口密钥的值数量)。
您还可以通过将IpAndPort
对象作为A
中的实例变量,替换ip
和port
变量来消除一点冗余。