java - 包含对列表

标签 java collections

  List<Pair<String, String> > lp = new ArrayList<Pair<String, String> >();
  lp.add(new Pair("1", "2"));

我应该如何检查列表 lp 是否包含 1 和 2,即 Pair ("1", "2")。

最佳答案

您的Pair 类需要实现equals()hashCode() 并且您已准备就绪。 List.contains() 是根据类型的 equals() 方法实现的。查看API for List.contains() . (对来自@maaartinus 的评论进行了一些编辑,你应该阅读他的回答 b/c 观察结果是可靠的,我把它们折叠在这里有点荒谬。正如 maaartinus 指出的那样,这里的最佳实践是避免容易出错的 equals 和 hashcode 手动定义,而是建立在 Guava 的 nullable equalshashCode for n objects 辅助函数之上。

final class Pair<T> {

   final T left;
   final T right;

   public Pair(T left, T right)
   {
     if (left == null || right == null) { 
       throw new IllegalArgumentException("left and right must be non-null!");
     }
     this.left = left;
     this.right = right;
   }

   public boolean equals(Object o)
   {
     // see @maaartinus answer
     if (! (o instanceof Pair)) { return false; }
     Pair p = (Pair)o;
     return left.equals(p.left) && right.equals(p.right);
   } 

   public int hashCode()
   {
      return 7 * left.hashCode() + 13 * right.hashCode();
   } 
}

有了合适的 equals(),您现在可以:

  lp.add(new Pair("1", "2"));
  assert lp.contains(new Pair("1","2"));

回应下面的评论,也许最好包括一个很好的引用“为什么我需要实现hashCode()?”

关于java - 包含对列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952631/

相关文章:

java - Tomcat 在尝试登录时给出 HTTP 状态 404

java - Spring:同一类的多个 Controller 实例

java - getActivity().runOnUiThread(new Runnable(){ 上的 NullPointerException

C++ 等价于不可变容器

java - 如何将逗号分隔的字符串转换为列表?

C# 将列表与自定义对象进行比较但忽略顺序

java - 对类型 `List<Iterable<Object>>` 的列表进行排序

java - 显示 ProgressDialog 时暂停 Android 应用程序的主线程

java - @Min 注释不起作用

hibernate - 如何配置 Element-collection 以映射 JPA orm.xml 配置中的现有数据库表?