我有两个ArrayLists。
ArrayList A包含
['2009-05-18','2009-05-19','2009-05-21']
ArrayList B包含['2009-05-18','2009-05-18','2009-05-19','2009-05-19','2009-05-20','2009-05-21','2009-05-21','2009-05-22']
我必须比较ArrayLst A和ArrayLst B.结果ArrayList 应该包含ArrayList A中不存在的List。 ArrayList结果应为
[ '2009-05-20', '2009-05-22']
如何比较?
答案 0 :(得分:186)
在Java中,您可以使用Collection
界面的removeAll
方法。
// Create a couple ArrayList objects and populate them
// with some delicious fruits.
Collection firstList = new ArrayList() {{
add("apple");
add("orange");
}};
Collection secondList = new ArrayList() {{
add("apple");
add("orange");
add("banana");
add("strawberry");
}};
// 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: [apple, orange]
Second List: [apple, orange, banana, strawberry]
Result: [banana, strawberry]
答案 1 :(得分:20)
你已经有了正确的答案。 如果您想在列表(集合)之间进行更复杂和有趣的操作,请使用apache commons collections(CollectionUtils) 它允许你进行结合/分离,找到交集,检查一个集合是否是另一个集合的子集和其他好东西。
答案 2 :(得分:11)
在带有流的Java 8中,它实际上非常简单。
List<String> listA = Arrays.asList("2009-05-18","2009-05-19","2009-05-21");
List<String> listB = Arrays.asList("2009-05-18","2009-05-18","2009-05-19","2009-05-19",
"2009-05-20","2009-05-21","2009-05-21","2009-05-22");
List<String> result = listB.stream()
.filter(not(new HashSet<>(listA)::contains))
.collect(Collectors.toList());
请注意,哈希集仅创建一次:方法引用与其contains方法相关联。对lambda执行相同操作需要在变量中设置该集合。制作变量并不是一个坏主意,特别是如果你觉得它变得难看或难以理解。
如果不使用此实用程序方法(或显式强制转换),则无法轻松negate the predicate,因为您无法直接调用negate方法引用(首先需要类型推断)。
private static <T> Predicate<T> not(Predicate<T> predicate) {
return predicate.negate();
}
如果流有filterOut
方法或其他东西,它会看起来更好。
答案 3 :(得分:9)
编辑:原始问题未指定语言。我的答案是在C#。
您应该为此目的使用HashSet。如果必须使用ArrayList,则可以使用以下扩展方法:
var a = arrayListA.Cast<DateTime>();
var b = arrayListB.Cast<DateTime>();
var c = b.Except(a);
var arrayListC = new ArrayList(c.ToArray());
使用HashSet ...
var a = new HashSet<DateTime>(); // ...and fill it
var b = new HashSet<DateTime>(); // ...and fill it
b.ExceptWith(a); // removes from b items that are in a
答案 4 :(得分:7)
我使用过Guava Sets.difference。
参数是集合而不是常规集合,但是从任何集合(具有唯一项目)创建集合的便捷方法是Guava ImmutableSet.copyOf(Iterable)。
(我首先发布了这个on a related/dupe question,但我也在这里复制它,因为我认为这是一个迄今为止缺少的好选项。)
答案 5 :(得分:7)
虽然这是Java 8中一个非常古老的问题,但您可以执行类似
的操作 List<String> a1 = Arrays.asList("2009-05-18", "2009-05-19", "2009-05-21");
List<String> a2 = Arrays.asList("2009-05-18", "2009-05-18", "2009-05-19", "2009-05-19", "2009-05-20", "2009-05-21","2009-05-21", "2009-05-22");
List<String> result = a2.stream().filter(elem -> !a1.contains(elem)).collect(Collectors.toList());
答案 6 :(得分:2)
我猜你在谈论C#。如果是这样,你可以尝试这个
ArrayList CompareArrayList(ArrayList a, ArrayList b)
{
ArrayList output = new ArrayList();
for (int i = 0; i < a.Count; i++)
{
string str = (string)a[i];
if (!b.Contains(str))
{
if(!output.Contains(str)) // check for dupes
output.Add(str);
}
}
return output;
}
答案 7 :(得分:1)
您只是在比较字符串。
将ArrayList A中的值作为HashTable A中的键。
将ArrayList B中的值作为HashTable B中的键。
然后,对于HashTable A中的每个键,将其从HashTable B中删除(如果存在)。
你在HashTable B中留下的是字符串(键),它们不是ArrayList A中的值。
为响应代码请求而添加了C#(3.0)示例:
List<string> listA = new List<string>{"2009-05-18","2009-05-19","2009-05-21'"};
List<string> listB = new List<string>{"2009-05-18","2009-05-18","2009-05-19","2009-05-19","2009-05-20","2009-05-21","2009-05-21","2009-05-22"};
HashSet<string> hashA = new HashSet<string>();
HashSet<string> hashB = new HashSet<string>();
foreach (string dateStrA in listA) hashA.Add(dateStrA);
foreach (string dateStrB in listB) hashB.Add(dateStrB);
foreach (string dateStrA in hashA)
{
if (hashB.Contains(dateStrA)) hashB.Remove(dateStrA);
}
List<string> result = hashB.ToList<string>();
答案 8 :(得分:1)
嗨,请使用此课程,这将比较两个列表,并准确显示两个列表中的错误b / w。
import java.util.ArrayList;
import java.util.List;
public class ListCompare {
/**
* @param args
*/
public static void main(String[] args) {
List<String> dbVinList;
dbVinList = new ArrayList<String>();
List<String> ediVinList;
ediVinList = new ArrayList<String>();
dbVinList.add("A");
dbVinList.add("B");
dbVinList.add("C");
dbVinList.add("D");
ediVinList.add("A");
ediVinList.add("C");
ediVinList.add("E");
ediVinList.add("F");
/*ediVinList.add("G");
ediVinList.add("H");
ediVinList.add("I");
ediVinList.add("J");*/
List<String> dbVinListClone = dbVinList;
List<String> ediVinListClone = ediVinList;
boolean flag;
String mismatchVins = null;
if(dbVinListClone.containsAll(ediVinListClone)){
flag = dbVinListClone.removeAll(ediVinListClone);
if(flag){
mismatchVins = getMismatchVins(dbVinListClone);
}
}else{
flag = ediVinListClone.removeAll(dbVinListClone);
if(flag){
mismatchVins = getMismatchVins(ediVinListClone);
}
}
if(mismatchVins != null){
System.out.println("mismatch vins : "+mismatchVins);
}
}
private static String getMismatchVins(List<String> mismatchList){
StringBuilder mismatchVins = new StringBuilder();
int i = 0;
for(String mismatch : mismatchList){
i++;
if(i < mismatchList.size() && i!=5){
mismatchVins.append(mismatch).append(",");
}else{
mismatchVins.append(mismatch);
}
if(i==5){
break;
}
}
String mismatch1;
if(mismatchVins.length() > 100){
mismatch1 = mismatchVins.substring(0, 99);
}else{
mismatch1 = mismatchVins.toString();
}
return mismatch1;
}
}
答案 9 :(得分:1)
这也与Arraylist一起工作
// Create a couple ArrayList objects and populate them
// with some delicious fruits.
ArrayList<String> firstList = new ArrayList<String>() {/**
*
*/
private static final long serialVersionUID = 1L;
{
add("apple");
add("orange");
add("pea");
}};
ArrayList<String> secondList = new ArrayList<String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
{
add("apple");
add("orange");
add("banana");
add("strawberry");
}};
// 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);