6

我有一个List<User> users,其中类User有一个属性username。我还有一个List<User> activeUsers。让users = activeUsers + inactiveUsers. 现在我想inactiveUsersusers基于username属性中提取。我使用两个 for 循环解决了这个问题。我认为这不是有效的方法。所以如果有人知道如何有效地完成它,请告诉我。

例如,我有 activeUsers[1,3] 和 users[1,2,3,4] 并且想要构建 inactiveUsers[2,4]。

4

4 回答 4

2

在 Java 中,您可以使用Collection接口的removeAll方法。

// Create a couple ArrayList objects and populate them
// with some delicious fruits.
Collection firstList = new ArrayList() {{
    add("user1");
    add("user2");
}};

Collection secondList = new ArrayList() {{
    add("user1");
    add("user1");
    add("user3");
    add("user4");
}};

// Show the "before" lists
System.out.println("First List: " + firstList);
System.out.println("Second List: " + secondList);

// Remove all elements in firstList from secondList
secondList.removeAll(firstList);

// Show the "after" list
System.out.println("Result: " + secondList);

上面的代码将产生以下输出:

First List: [user1, user2]
Second List: [user1, user2, user3, user4]
Result: [user3, user4]
于 2013-04-14T13:56:25.183 回答
0

您可以根据用户是否处于活动状态将用户存储在 Set 中,我更喜欢 User 上的属性,但我想您不希望在您的此分配中使用该属性。使用此代码,您的问题可以在 O(n) 时间内解决。假设你没有弄乱用户中的 equals/hashCode。

package com.stackoverflow.q15999468;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Users
{
    public static void main(String[] args)
    {
        List<User> users = Arrays.asList(u1,u2,u3,u4,u5);
        List<User> activeUsers = Arrays.asList(u3,u5);

        Set<User> activeUsersSet = new HashSet<User>(activeUsers);

        List<User> inactiveUsers = new ArrayList<User>();

        for(User user : users)
        {
            if(!activeUsersSet.contains(user))
            {
                inactiveUsers.add(user);
            }
        }
        System.out.println("Inactive users: " + inactiveUsers);
    }
}
于 2013-04-14T13:49:57.413 回答
0

好吧,基于修改User问题的类别和性质的限制,没有办法比o(n^2)使用两个列表(即两个循环)少。当然,如果您可以拥有每种类型的两个列表,那么您的问题就完成了。

但是因为你不能比逻辑是:(假设你的结构只是列表)

Iterate users list (o(n)) :
   - Search the active users list for the current user (o(n)) 

无论你怎么看,你都会得到o(n^2)

如果您可以修改为具有激活属性,则可以通过一次搜索User轻松地将问题减少到o(n)

于 2013-04-14T13:23:55.190 回答
0

这应该工作

List<User> inactiveUsers = new ArrayList<User>(users);
inactiveUsers.removeAll(activeUsers) ;
于 2013-04-14T13:59:32.083 回答