簡體   English   中英

Java-從兩個不同數據類型的ArrayList中獲取公共元素

[英]Java - Getting common element from two ArrayLists of different data type

我有兩個大小不同的ArrayList。

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);

您需要遍歷users-list並檢查每個元素是否包含在名稱中。 如果其中有很多元素,則可能要使用Set而不是列表作為名稱。

如果您確實在內部循環使用names.contains(..)遍歷Users,那么您正在執行^ 2循環(大約來說)。

我會將用戶地址放入地圖中,按名稱鍵入,然后遍歷名稱列表,將地址從地圖中拉出。 費用為2n(大約)。

在java-8中,您可以按以下方式使用流和收集器,
邏輯是
1.在兩個列表中查找命令屬性
2.將較小的列表轉換為Map<Common_attribute, Actual_List_Object> ,復雜度為O(n)
3.迭代較大的列表,並檢查其中是否包含地圖,然后將其添加到另一個具有O(n)空間復雜度的O(n)復雜度(地圖查找為〜O(1)),
否則將是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'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM