比较2个ArrayLists的简单方法

pra*_*abu 35 java list arraylist

我有两个字符串对象的arraylists.

List<String> sourceList = new ArrayList<String>();
List<String> destinationList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

我有一些逻辑,我需要处理源列表,并最终得到目标列表.目标列表将添加一些其他元素添加到源列表或从源列表中删除.

我的预期输出是2个字符串ArrayList,其中第一个列表应该从源中删除所有字符串,第二个列表应该具有新添加到源的所有字符串.

任何更简单的方法来实现这一目标?

Max*_*tin 59

将列表转换为 Collection并使用removeAll

    Collection<String> listOne = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g"));
    Collection<String> listTwo = new ArrayList(Arrays.asList("a","b",  "d", "e", "f", "gg", "h"));


    List<String> sourceList = new ArrayList<String>(listOne);
    List<String> destinationList = new ArrayList<String>(listTwo);


    sourceList.removeAll( listTwo );
    destinationList.removeAll( listOne );



    System.out.println( sourceList );
    System.out.println( destinationList );
Run Code Online (Sandbox Code Playgroud)

输出:

[c, g]
[gg, h]
Run Code Online (Sandbox Code Playgroud)

[编辑]

其他方式(更清楚)

  Collection<String> list = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g"));

    List<String> sourceList = new ArrayList<String>(list);
    List<String> destinationList = new ArrayList<String>(list);

    list.add("boo");
    list.remove("b");

    sourceList.removeAll( list );
    list.removeAll( destinationList );


    System.out.println( sourceList );
    System.out.println( list );
Run Code Online (Sandbox Code Playgroud)

输出:

[b]
[boo]
Run Code Online (Sandbox Code Playgroud)

  • 如果要通过"removeAll"比较自定义对象,请不要忘记实现"equals"和"hashCode"方法. (4认同)

Hus*_*man 14

这应检查两个列表是否相等,它首先进行一些基本检查(即空值和长度),然后排序并使用collections.equals方法检查它们是否相等.

public  boolean equalLists(List<String> a, List<String> b){     
    // Check for sizes and nulls

    if (a == null && b == null) return true;


    if ((a == null && b!= null) || (a != null && b== null) || (a.size() != b.size()))
    {
        return false;
    }

    // Sort and compare the two lists          
    Collections.sort(a);
    Collections.sort(b);      
    return a.equals(b);
}
Run Code Online (Sandbox Code Playgroud)

  • 你在检查它们的大小后检查列表是否为空...这是错误的 (14认同)

Rak*_* KR 5

Listin 转换为String并检查字符串是否相同

import java.util.ArrayList;
import java.util.List;



/**
 * @author Rakesh KR
 *
 */
public class ListCompare {

    public static boolean compareList(List ls1,List ls2){
        return ls1.toString().contentEquals(ls2.toString())?true:false;
    }
    public static void main(String[] args) {

        ArrayList<String> one  = new ArrayList<String>();
        ArrayList<String> two  = new ArrayList<String>();

        one.add("one");
        one.add("two");
        one.add("six");

        two.add("one");
        two.add("two");
        two.add("six");

        System.out.println("Output1 :: "+compareList(one,two));

        two.add("ten");

        System.out.println("Output2 :: "+compareList(one,two));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但是你不知道命令! (4认同)

小智 5

如果您的要求是维护插入顺序并检查两个数组列表的内容,那么您应该执行以下操作:

List<String> listOne = new ArrayList<String>();
List<String> listTwo = new ArrayList<String>();

listOne.add("stack");
listOne.add("overflow");

listTwo.add("stack");
listTwo.add("overflow");

boolean result = Arrays.equals(listOne.toArray(),listTwo.toArray());
Run Code Online (Sandbox Code Playgroud)

这将返回 true。

但是,如果您更改顺序,例如:

listOne.add("stack");
listOne.add("overflow");

listTwo.add("overflow");
listTwo.add("stack");

boolean result = Arrays.equals(listOne.toArray(),listTwo.toArray());
Run Code Online (Sandbox Code Playgroud)

将返回 false,因为排序不同。