我有两个ArrayList
。每个都是100000大小。我想比较它们并计算匹配的元素。
这是我的代码:
for (int i = 0; i < mArryLst2.size(); i++) {
if (ArryLst1.contains(mArryLst2.get(i))) {
matchedPixels++;
}
}
这里的比较过程耗费了大量时间。
如何解决和优化此问题。
答案 0 :(得分:10)
你应该使用CollectionUtils.retainAll
:返回一个集合,其中包含collection1中同样位于collection2中的所有元素。
ArrayList commonList = CollectionUtils.retainAll(list1,list2);
答案 1 :(得分:5)
您应该将第一个列表转换为HashSet。 HashSet查找是O(1),列表查找是O(n)。这使得整个算法O(n)而不是O(n ^ 2)
Set<Foo> set1 = new HashSet<Foo>(list1);
for (Foo foo : list2) {
if (set1.contains(foo)) {
matchedPixels++;
}
}
答案 2 :(得分:1)
您应该查看此链接How to compare two Arraylist values in java?。制作一个列表的副本,然后调用全部删除列表中的其他列表
List result = new ArrayList(mArryLst2);
result.removeAll(ArryLst1);
答案 3 :(得分:0)
最佳选择是将第一个ArrayList的所有元素放入一个Set(它只允许使用唯一元素)。
现在,从你的第二个ArrayList中,将每个元素添加到你的Set中,如果你的集合中已经存在该元素,那么它将返回false。
如果您有2个arrayLists ArrayList1和ArrayList2,并且您希望所有匹配在另一个ArrayList Diff
HashSet hs = new HashSet();
for(int i : ArrayList1) hs.add(i);
for(int i : ArrayList2)
{
if(!hs.add(i))
Diff.add(i);
}
答案 4 :(得分:0)
我认为会更快
Set set = new HashSet();
set.addAll(ArryLst1);
for (int i = 0; i <mArryLst2.size(); i++)
{
if (set .contains(mArryLst2.get(i)))
{
matchedPixels++;
}
}
答案 5 :(得分:0)
有两种方法可以加快速度(特别是对于大型数组)并简化代码;
// Quick Check to see if the two arrayLists have the same number of elements
if (array1.size() != array2.size())
return false;
// Optionally Sort the arrays - avoid returning false if the elements are the same but
// have been stored out of sequence
Collections.sort(array1);
Collections.sort(array2);
if (array1.hashCode() == array2.hashCode()) {
return true;
} else {
return false;
}
答案 6 :(得分:0)
最好的方法是覆盖equals方法并检查数组列表中的每个对象是否相等。
public class CustomClass {
String x;
String a;
String b;
String c;
long l;
@Override
public boolean equals(Object obj) {
return (this.blindlyEquals(obj) && ((CustomClass) obj).blindlyEquals(this));
}
protected boolean blindlyEquals(Object o) {
if (!(o instanceof CustomClass))
return false;
CustomClass p = (CustomClass)o;
return (p.x == this.x && p.a == this.a && p.b == this.b && p.c == this.c && p.l == this.l);
}
}
public class MainClass {
ArrayList<CustomClass> member = new ArrayList<CustomClass>();
ArrayList<CustomClass> server;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainClass mainClass = new MainClass();
mainClass.server = mainClass.getServerList();
mainClass.member = mainClass.getLocalList();
if(mainClass.member.equals(mainClass.server)){
System.out.println("true");
//do the needfull, run a for loop to check which object is not equal
}else{
System.out.println("false");
//do the needfull, run a for loop to check which object is not equal
}
}
public ArrayList<CustomClass> getServerList(){
ArrayList<CustomClass> server = new ArrayList<CustomClass>();
CustomClass obj = new CustomClass();
CustomClass obj2 = new CustomClass();
obj.a = "ali";
obj.b = "ball";
obj.c = "cat";
obj.x = "xerox";
obj.l = 10;
obj2.a = "ali";
obj2.b = "ball";
obj2.c = "cat";
obj2.x = "xerox";
obj2.l = 10;
server.add(obj);
server.add(obj2);
return server;
}
public ArrayList<CustomClass> getLocalList(){
ArrayList<CustomClass> memberOne = new ArrayList<CustomClass>();
CustomClass obj = new CustomClass();
CustomClass obj2 = new CustomClass();
obj.a = "ali";
obj.b = "ball";
obj.c = "cat";
obj.x = "xerox";
obj.l = 10;
obj2.a = "ali";
obj2.b = "ball";
obj2.c = "cat";
obj2.x = "xerox";
obj2.l = 10;
memberOne.add(obj);
memberOne.add(obj2);
return memberOne;
}
}
答案 7 :(得分:0)
您可以使用
ArrayList Listname = ListUtils.retainAll(list1,list2);