Java - 从两个不同数据类型的 ArrayList 中获取公共元素



我有两个不同大小的ArrayLists。

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

用户是具有属性名称和地址的对象。我想获取存储在 ArrayList 用户中的 User 对象名称与存储在 ArrayList 名称中的名称相同的地址。

这可能吗?如果是这样,如何?

for (User u : users) {
  if (names.contains(u.getName()) {
    System.out.println("Name: " + u.getName() + ", address: " + u.getAddress());
  }
}
你可以

使用 Java 8。

请尝试:

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

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

如果你确实循环了内部有names.contains(..)的用户,你正在执行一个 n^2 循环(大约说)。

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

在java-8中,你可以使用流和收集器,如下所示,
逻辑是
1. 在两个列表中
查找命令属性2. 将较小的列表转换为 Map<Common_attribute, Actual_List_Object> , 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'}]

相关内容

  • 没有找到相关文章

最新更新