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

mon*_*nda 0 java

我是java的新手.

我有2个字符串数组列表

List<String> a= [2,14]
List<String> b= [2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

我想要两个新的ArrayLists

1)列表具有b但不在的值a

  List<String> c= [3,4,5]
Run Code Online (Sandbox Code Playgroud)

2)列表有值a但不在b

  List<String> d=[14]
Run Code Online (Sandbox Code Playgroud)

我试过了:

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

这不是删除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);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

你真的提出的是集合操作而不是列表操作 - 在这种情况下,你最好使用a而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);
Run Code Online (Sandbox Code Playgroud)

(这将为工作ArrayList,以及HashSet-我只是改为使用套,因为它是当你想基于集合的操作更合适的类型.)

或者更好,使用番石榴Sets.difference方法:

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

Set<String> c = Sets.difference(b, a);
Set<String> d = Sets.difference(a, b);
Run Code Online (Sandbox Code Playgroud)

这将创建有关差异的视图 - 因此对原始集的更改将反映在视图中.您可以通过创建新的视图来有效地拍摄视图的快照HashSet:

Set<String> snapshot = new HashSet<String>(c);
Run Code Online (Sandbox Code Playgroud)