我有两个ArrayList相同的模型类(即ListA和ListB),我添加了相同的数据.然后我只在第二个arraylist中添加了一些数据ListB.
现在,我只想要获取的数据是在两个不同的ListA和ListB,结果保存在第三个数组列表ListC.
我试过下面的代码.但是,所有元素都存储在其中ListC,而不是仅存储不同的元素:
ArrayList<C> ListC = new ArrayList<>();
for (int i = 0; i < ListA.size(); i++) {
for (int j = 0; j < ListB.size(); j++) {
if (ListA.get(i).getName() == ListB.get(j).getName()) {
Log.e("Do", "Nothing");
} else {
C c = new C(b.get(j).getName());
ListC.add(c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑问题
ArrayList<Model> a = new ArrayList<>();
Model model = new Model();
model.setName("MaHi");
model.setAge("20");
a.add(model);
ArrayList<Model> b = new ArrayList<>();
Model model = new Model();
model.setName("MaHi");
model.setAge("20");
b.add(model);
Model model2 = new Model();
model2.setName("Ritu");
model2.setAge("21");
b.add(model2);
ArrayList<Model> c=new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
现在我想将那些不在arraylist a或arraylist b中的数据(即model2的数据)提取到c的arraylist中;
问题是你正在迭代所有组合.
让我们说A = [1, 2, 3]和B = [1, 3, 4].然后,你的循环将进行比较
a=1与b=1.两者都是平等的,没有做任何事.非常好.a=1与b=3.它们不相等,所以添加了3 C.这是你的第一个问题:3实际上是在A,但只是不在你当前的迭代中.a=1与b=4.它们不相等,因此增加了4 C.在这种情况下,这是可以的,因为4不在A.a=2与b=1.它们不相等,所以添加1 C.然而,实际上是1 A.你看到你的解决方案不起作用了吗?你不能比较每个组合.相反,你必须检查其中的每个元素B,如果它在A.如果不是,请添加.这个,直接翻译成伪代码,看起来像
// for every element in ListB
for (int i = 0; i < ListB.length(); i++) {
B b = ListB.get(i);
// if this is not in ListA
if (!ListA.contains(b))
ListC.add(b);
}
Run Code Online (Sandbox Code Playgroud)
但是,在这里你应该使用for-each循环for (B b: ListB).甚至更好,只需使用ListC.addAll(ListB); ListB.removeAll(ListA).(并确保hashCode并equals正确编写 - 但这是一个不同的问题.)
当然,这需要在元素ListA和ListB是同一类型的.请参阅Jekin对使用较少标准库方法的解决方案的答案,这些方法也适用于不同类型(getName()当然,只要两者都实现).
这也解决了第二个问题,如您对问题的评论中所述:您无法比较字符串==,但必须使用该equals方法.尝试x = new String("a"); y = new String("a"); assert(x==y);和assert(x.equals(y));