我有两个不同大小的ArrayLists。
ArrayList<String> names = new ArrayList<String>();
ArrayList<User> users = new ArrayList<User>();
用户是具有属性名称和地址的对象。我想获取存储在ArrayList用户中的User对象的名称与存储在ArrayList名称中的名称相同的地址。
这可能吗?如果是这样,怎么样?
答案 0 :(得分:5)
for (User u : users) {
if (names.contains(u.getName()) {
System.out.println("Name: " + u.getName() + ", address: " + u.getAddress());
}
}
答案 1 :(得分:1)
您可以使用Java8。
请尝试:
users.stream().filter(u -> names.contains(u.getName())).map(
u -> "Name: " + u.getName() + ", address: " + u. getAddress()).forEach(System.out::println);
答案 2 :(得分:0)
您需要遍历users-list并检查每个元素是否包含在名称中。如果你有很多元素,你可能想要使用Set而不是列表。
答案 3 :(得分:0)
如果您在内部使用names.contains(..)
的用户进行循环,那么您正在进行n ^ 2循环(大概说)。
我会将用户地址放入地图中,按名称键入,然后遍历名称列表,将地址拉出地图。费用为2n(大致)。
答案 4 :(得分:0)
在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'}]