Java:根据现有ArrayList中的某些条件创建新的ArrayLists

时间:2014-01-01 10:04:17

标签: java

我是java新手。

我有2个字符串数组列表

List<String> a= [2,14]
List<String> b= [2,3,4,5]

我想要两个新的ArrayLists

1)列表的值为b但不在a

  List<String> c= [3,4,5]

2)列表的值为a但不在b

  List<String> d=[14]

我试过了:

    List<String> c = new ArrayList<String>(b);
    c.removeAll(a);
   System.out.println("c::::::::::::::::::::::::::::::"+c);  // 2,3,4,5

没有删除List a

的值

完整代码

   public static void updatePartyType(List<String> oldPartyKeys, List<String> newPartyKeys, String customerCode) {
   System.out.println("oldPartyKeys--->"+oldPartyKeys);// 2,14
   System.out.println("newPartyKeys--->"+newPartyKeys); // 2,3,4,5

   System.out.println("oldPartyKeys class --->"+oldPartyKeys.getClass());// class java.util.ArrayList

   List<String> newlySelectedPartyKeys = new ArrayList<String>(newPartyKeys);
   newlySelectedPartyKeys.removeAll(oldPartyKeys);
                    System.out.println("newlySelectedPartyKeys::::::::::::::::::::::::::::"+newlySelectedPartyKeys);

5 个答案:

答案 0 :(得分:6)

您真正提出的设置操作不仅仅是列表操作 - 在这种情况下,您最好使用HashSet而不是ArrayList。然后你可以使用Collection<E>.removeAll

Set<String> a = ...;
Set<String> b = ...;

Set<String> c = new HashSet<String>(b);
c.removeAll(a);

Set<String> d = new HashSet<String>(a);
d.removeAll(b);

(这适用于ArrayList以及HashSet - 我只更改为使用集合,因为当您需要基于集合的操作时,它是更合适的类型。)

或者更好的是,使用GuavaSets.difference方法:

Set<String> a = ...;
Set<String> b = ...;

Set<String> c = Sets.difference(b, a);
Set<String> d = Sets.difference(a, b);

这将在差异上创建视图 - 因此对原始集的更改将反映在视图中。您可以通过创建新的HashSet

来有效地拍摄视图的快照
Set<String> snapshot = new HashSet<String>(c);

答案 1 :(得分:3)

可以使用removeAll方法完成此操作:

List<String> c = new ArrayList<>(b);
c.removeAll(a);

List<String> d = new ArrayList<>(a);
d.removeAll(b);

答案 2 :(得分:2)

将您的列表转换为Set个实例。然后,您可以通过自己的实现或使用第三方库(例如 Google Guava )轻松找到集合的差异,例如Sets.difference()

答案 3 :(得分:2)

查看addAll()

中的removeAll()ArrayList

现在您需要b\a b.removeAll(a)a\b <{1}}

一个工作示例(这适用于那些刚接触Java的人,所以它很冗长):

a.removeAll(b)

答案 4 :(得分:1)

addAll元素,然后是a中显示的removeAll元素。

时间复杂度为O(n)。