【问题标题】:Java - Getting common element from two ArrayLists of different data typeJava - 从两个不同数据类型的 ArrayList 中获取公共元素
【发布时间】:2012-07-06 17:51:02
【问题描述】:

我有两个不同大小的 ArrayList。

ArrayList<String> names = new ArrayList<String>();
ArrayList<User> users = new ArrayList<User>();

User 是一个具有 name 和 address 属性的对象。我想获取存储在 ArrayList users 中的 User 对象的名称与存储在 ArrayList names 中的名称相同的地址。

这可能吗?如果有,怎么做?

【问题讨论】:

    标签: java object arraylist compare


    【解决方案1】:
    for (User u : users) {
      if (names.contains(u.getName()) {
        System.out.println("Name: " + u.getName() + ", address: " + u.getAddress());
      }
    }
    

    【讨论】:

    • 哇!您刚刚解决了不同尺寸和不同类型的问题,并将我的非工作 for 循环缩短了一吨!非常感谢!
    【解决方案2】:

    您可以使用 Java 8。

    请尝试:

    users.stream().filter(u -> names.contains(u.getName())).map(
                    u -> "Name: " + u.getName() + ", address: " + u. getAddress()).forEach(System.out::println);
    

    【讨论】:

      【解决方案3】:

      您需要遍历用户列表并检查每个元素是否包含在名称中。如果其中有很多元素,您可能希望使用 Set 而不是列表作为名称。

      【讨论】:

        【解决方案4】:

        如果您在内部使用 names.contains(..) 的用户进行循环,则您正在执行 n^2 循环(大致而言)。

        我会将用户地址放入地图中,按名称键入,然后遍历名称列表,将地址从地图中拉出。成本 2n(大约)。

        【讨论】:

          【解决方案5】:

          在 java-8 中,您可以使用如下流和收集器,
          逻辑是
          1.在两个列表中查找命令属性
          2. 将较小的列表转换为Map&lt;Common_attribute, Actual_List_Object&gt;,O(n) 复杂度
          3. 迭代更大的列表并检查是否包含地图,然后将其添加到另一个列表中,O(n) 复杂度(地图查找约为 O(1)),空间复杂度为 O(n),
          否则它将是 O(n^2)(接受答案的复杂性)

          假设用户的类为

          class User {
                  private String name;
          
                  private String getName() {
                      return this.name;
                  }
          
                  @Override
                  public String toString() {
                      return "User{" +
                              "name='" + name + '\'' +
                              '}';
                  }
              }
          

          // 服务于目的的代码

          import java.util.stream.Collectors;
          
          ArrayList<String> names = new ArrayList<>();
          ArrayList<User> users = new ArrayList<>();
          
          //adding to name list
          names.add("a");
          //adding to User list
          User user = new User();
          user.name = "a";
          User user2 = new User();
          user2.name = "b";
          
          users.add(user);
          users.add(user2);
          // Using user's name as key, you can specify any data type as key and create a map
          Map<String, User> nameUserMap = users.stream().collect(Collectors.toMap(user1 -> user1.getName(), user1 -> user1));
          System.out.println(nameUserMap);
          List<User> filteredList = names
                      .stream()
                      .map(nameUserMap::get)
                      .filter(Objects::nonNull)
                      .collect(Collectors.toList());
          System.out.println(filteredList);
          

          输出:

          {a=User{name='a'}, b=User{name='b'}}
          [User{name='a'}]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多